我有一个refresh
范围的指令。在我的情况下,刷新应该是对象或函数,因此如何将其分配给指令。
1.第一种情况
<!--HTML-->
<directive
refresh="vm.refresh">
</directive>
//JS
scope:{refresh:"="}
2.第二种情况
<directive
refresh="vm.refresh(search)">
</directive>
//JS
scope:{refresh:"&"}
3.我的情况
<directive
refresh="vm.refresh or vm.refresh(search)">
</directive>
//JS - What to do ? need help
scope:{refresh:"=&needHelp"}
但是我在指令中需要这两个功能,因此如何隔离这两个功能。我需要知道应用的刷新范围是指令的链接函数中的对象OR函数。
最佳答案
这是棘手的情况。在这种情况下,您可以检查refresh
属性具有哪种类型的表达式。但是,您需要借助$parse
服务手动解析属性值。
.directive('directive', function($parse) {
return {
scope: {
// some other bindings, scope is isolated
},
template: '<button ng-click="test()">Test</button>',
link: function(scope, element, attrs) {
// parse attribute expression (not evaluated yet)
var callback = $parse(attrs.refresh);
scope.search = 'Search query';
scope.test = function() {
// when needed to refresh: evaluate refresh callback
var evalled = callback(scope.$parent, {search: scope.search});
if (typeof evalled == 'function') {
evaled(scope.search);
}
};
}
};
})
在
refresh="vm.refresh(search)"
情况下,callback(scope.$parent, {search: scope.search})
可以解决问题。但是,如果该评估返回一个函数,则表示这是refresh="vm.refresh"
情况-然后它将进入if
块并使用必要的参数执行该函数。演示:http://plnkr.co/edit/4W0SKOzpL5LUP0OAofp5?p=info