Angular指令不使用此代码

时间:2014-07-09 11:35:19

标签: angularjs angularjs-directive directive

我必须遗漏一些东西,但我无法弄清楚为什么这条指令没有出现,是否有人可以提供帮助?

<body ng-controller="MainCtrl">
<p>Test is <b>{{name}}</b> with myValue <b>{{myValue}}</b></p>
<my-new-directive my-test="{{myValue}}"></my-new-directive>
</body>

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
$scope.myValue = true;
});


app.directive('myNewDirective', function() {
return {
 restrict: 'E',
 replace: true,
 link: function(scope, element, attrs) {
    attrs.$observe('myTest', function() {
    scope.name = attrs.myTest;
    if (!attrs.myTest) {
      this.template = '<div>FALSE</div>';
    } else {
      this.template = '<div>TRUE</div>';
    }
    scope.$apply();
  });
}
};
});

http://embed.plnkr.co/zijm24/preview

2 个答案:

答案 0 :(得分:1)

您不应该从链接功能返回模板。

你可以这样做:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';
  $scope.myValue = true;
});


app.directive('myNewDirective', function() {
    return {
      restrict: 'E',
      replace: true,
      transclude: true,
      template: '<div>{{val}}</div>',
      link: function(scope, element, attrs) {
        attrs.$observe('myTest', function() {
          scope.name = attrs.myTest;
          if (!angular.fromJson(attrs.myTest)) {
            scope.val= 'FALSE';
          } else {
            scope.val= 'TRUE';
          }
          scope.$apply();
        });
      }
    };
  });

答案 1 :(得分:1)

我会将此缩减为此代码:

<body ng-controller="MainCtrl">
    <p>Test is <b>{{name}}</b> with myValue <b>{{myValue}}</b></p>
    <label><input type="checkbox" ng-model="myValue"> myValue</label>
    <my-new-directive my-test="myValue"></my-new-directive>
</body>

请注意,在上面的HTML中,my-test直接接收模型,而不是表达式。另外,我添加了一个包含复选框的演示,以便您可以切换值。

然后,JS看起来像你需要的那样:

app.directive('myNewDirective', function() {
    return {
        restrict: 'E',
        scope: {
            name: '=myTest'
        },
        template: '<div>{{ name }}</div>'
    };
});

所以基本上,我删除了transclusion,因为你没有使用它(如果需要的话重新添加)并引入了一个双向绑定隔离范围,而不是手动添加逻辑来观察父范围模型的值。这使您可以完全摆脱链接功能 - 至少在您需要添加额外功能之前。