我有一个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

09-10 10:45
查看更多