这是我的指令的缩减:
app.directive('myDirective', function() {
return {
restrict: 'E',
replace: true,
template:
'<form name="form" action="{{action}}" method="post" target="_blank">' +
'<input type="hidden" name="item_name" value="{{itemname}}">' +
'</form>',
scope: {
action: '@action',
itemname: '@itemname',
},
link: function(scope, element, attrs) {
scope.action = attrs.action || 'http://www.example.com';
scope.itemname = attrs.itemname();
}
};
});
我用这种方式:
<div ng-if="itemWasSelected">
<my-directive
action="{{ 'http://www.example.com' }}"
itemname="itemNameBuildFunction"
/>
</div>
在我的控制器中,我有:
$scope.itemNameBuildFunction = function() {
return $scope.value1 + $scope.value2;
};
我希望我的指令在链接时(它在ng-if
子句中,所以,我的意思是,当ng-if
条件评估为真时),调用attrs.itemname()
$ scope函数,用于在控制器的链接函数中分配scope.itemname变量。
相反,我得到的是错误:
TypeError: attrs.itemname is not a function
你能告诉我一些指示吗?正如你所看到的,我很困惑,有角度指令......: - (
答案 0 :(得分:2)
您不需要此声明def Descending_Order(num):
digits = [digit for digit in list(str(num))]
return int("".join(sorted(digits, reverse = True)))
# Output
>>> Descending_Order(123456789)
987654321
。
在指令中传递的函数引用绑定到attrs.itemname()
上的变量itemname
,该变量作为scope
函数中的第一个参数传递link
只需更改
中的语句即可isolated scope
致:
scope.itemname = attrs.itemname();
编辑:
您使用了scope.itemname(); // this will call the function `itemNameBuildFunction`
运算符ofr绑定函数,该函数用于传递基元或对象的情况。您正在传递函数,因此,您应该使用@
运算符,将其作为函数进行求值。
&
编辑2:
Yous应该通过函数scope: {
action: '@action',
itemname: '&itemname',
}
而不是itemNameBuildFunction()
itemNameBuildFunction
工作Plunker
答案 1 :(得分:0)
在我看来,你真的想要'='
类型,它将接受javascript对象,并且(不需要JSON.parse)允许你在你的范围内使用它们。函数是javascript对象,可以使用();
所以最好的解决方案是:
scope: {
action: '@',
itemname: '=',
},
这将允许您对项目名称进行回调,然后在您认为合适的范围内运行它。
https://plnkr.co/edit/cKzLhP4SwHey266Flr5w?p=preview
另外,有人会如何提交您提供的表格?如果您想提交隐藏的输入名称,那么您应该拥有<input type='submit'/>
似乎没有意义。此外,您可能希望使用templateURL并包含HTML模板,而不是在您的js中使用大型动态表单。