Javascript 从字符串变量中设置属性值
我有一个外部JSON文件,它是这样的按钮/操作的集合Javascript 从字符串变量中设置属性值,javascript,angularjs,angularjs-1.6,Javascript,Angularjs,Angularjs 1.6,我有一个外部JSON文件,它是这样的按钮/操作的集合 { "foo1":{ "name":"productDetails", "displayAs":"button", "action":"viewDetails()" }, "foo2":{ "name":"sell", "displayAs":"button", "action":"sellProduct()" } } 稍后,在
{
"foo1":{
"name":"productDetails",
"displayAs":"button",
"action":"viewDetails()"
},
"foo2":{
"name":"sell",
"displayAs":"button",
"action":"sellProduct()"
}
}
稍后,在我看来,我为JSON中包含的每个对象创建了一个
我的问题是,我可以像这样在JSON文件中设置ng click属性吗
<li ng-repeat = "field in fields">
<div ng-click = field.action > {{field.name}} </div>
</li>
{{field.name}
您可以使用ng bind html
执行此操作
<li ng-repeat = "field in fields">
<div bind-html-compile ng-bind-html="trust(field)" > </div>
</li>
在trust
函数中,将对象作为参数传递,并返回html信任元素
$scope.trust = function(html) {
return $sce.trustAsHtml('<div ng-click = "' + html.action + '" > {{field.name}} </div>');
}
$scope.trust=函数(html){
返回$sce.trustAsHtml(“{field.name}”);
}
演示
角度模块(“应用程序”,[])
.controller(“ctrl”,函数($scope,$sce){
$scope.viewDetails=function(){console.log(“viewDetails”)}
$scope.sellProduct=function(){console.log(“sellProduct”)}
$scope.fields={
“foo1”:{
“名称”:“产品详细信息”,
“显示方式”:“按钮”,
“操作”:“viewDetails()”
},
“foo2”:{
“名称”:“出售”,
“显示方式”:“按钮”,
“操作”:“sellProduct()”
}
}
$scope.trust=函数(html){
返回$sce.trustAsHtml(“{field.name}”);
}
}).directive('bindHtmlCompile',['$compile',函数($compile){
返回{
限制:“A”,
链接:函数(范围、元素、属性){
范围:$watch(函数(){
返回范围$eval(attrs.bindHtmlCompile);
},函数(值){
html(值);
$compile(element.contents())(范围);
});
}
};
}]);代码>
为什么不试着检查一下你是否可以这样做呢?如果你只是在json中使用函数名(比如操作:'viewDetails'
),你可以使用$scope[field.action]()
或这个[field.action]()
,这取决于你的控制器是如何组织的,或者使用if/else树:if(field.action==“viewDetails()”)$scope.viewDetails()
是的,您可以,但您必须稍微更改数据。照@DevDig说的去做@KOUSIKMANDAL如果我不试试,我就不会发这个,你不觉得吗?:)为什么ng bind html
有trust(field)
,它被设计成将html
放在元素内部。trust函数返回html,以便ng bind html将绑定,我建议用更简单的方法
$scope.trust = function(html) {
return $sce.trustAsHtml('<div ng-click = "' + html.action + '" > {{field.name}} </div>');
}