6

我创建了一个接受回调作为属性的指令,例如:

<my-directive callback-expression="someFunction()"> </my-directive>

该指令是可重用的,因此我给了它一个隔离范围。我想根据是否callback-expression设置了该属性在指令中显示一个按钮。

App.directive('myDirective', function(){
  restrict: 'E',
  scope:    {
              callbackExpression: '&'
            },
  template: '<button ng-show="!!callbackExpression">Fire callback</button>'
});

问题是,即使表达式为空,它也是一个函数:

console.log($scope.callbackExpression)具有空白属性会导致:

function (locals) {
  return parentGet(parentScope, locals);
}

我目前的解决方案是在我的链接功能的顶部有这一行:

if (attributes.callbackExpression) scope.callbackButton = true

然后ng-showcallbackButton

是否有任何替代方案不需要额外的线和范围属性?

4

2 回答 2

3

如果您想避免将任何东西放在堆栈上,那么您可以使用链接功能,您可以通过attrs. 这里有两种方法:

链接功能选项1:

您可以在指令中使用此链接函数而不是使用模板,该函数有条件地添加您的模板:

link: function (scope, element, attrs) {     
     if (attrs.callbackExpression) {
         var html = '<button>Fire callback</button>';
         element.replaceWith(html);
     }
}

选项 1 演示:http: //jsfiddle.net/ZC4MZ/2/

链接功能选项 2(更适合大型模板):

对于大型模板,您可以使用$templateCache. 首先添加模板:

myApp.run(function($templateCache) {
  $templateCache.put('myDirective.html', '<button>Fire callback</button>');
});

然后像选项 1 一样有条件地使用它,但使用$templateCache.get()

link: function (scope, element, attrs) {     
    if (attrs.callbackExpression) {
        var html = $templateCache.get('myDirective.html');
        element.replaceWith(html);
    }
}

确保注入$templateCache您的指令:

myApp.directive('myDirective', function ($templateCache) {

这是一个使用的演示:http $templateCache: //jsfiddle.net/ZC4MZ/3/

仅使用模板的选项:

要使用模板,您需要在作用域上添加一个变量。为此,您可以保留所有内容,只需添加:

link: function(scope, element, attrs) {
      scope.callbackExpression = attrs.callbackExpression;}
}

模板/范围变量演示:http: //jsfiddle.net/ZC4MZ/5/

于 2013-11-13T20:27:43.190 回答
1

您可以使用可以在指令中注入的 $attrs 对象来获取此信息。

标记:

  <body ng-app="myApp" ng-controller="MyController">
    <my-directive text="No Expression"></my-Directive>
    <my-directive text="Expression" callback-expression="myCallback()"></my-Directive>
  </body>

JS:

app.directive('myDirective', function(){

  return {
    restrict: "E",
    scope: {
      text: '@',
      callbackExpression:'&'
    },
    templateUrl: "partial.html",
    link: function($scope, $elem, $attrs) {
      $scope.expressionCalled = false;
      if ($attrs.callbackExpression) {
        $scope.expressionCalled = true;
      }
    }
  }

});

我为此示例创建了一个工作 plunk: http ://plnkr.co/edit/K6HiT2?p=preview

于 2014-03-28T16:49:19.910 回答