带有ng-transclude的angular指令

时间:2016-11-01 09:14:00

标签: javascript angularjs angularjs-ng-transclude

我已根据HTML <p>标记创建了一个非常简单的段落指令。

angular.module('myApp').directive('paragraph', function() {
  return {
    restrict: 'E',
    transclude: true,
    controller: function() {
      var vm = this;
      vm.text = "Paragraph text from controller"
    },
    controllerAs: 'ParagraphViewModel',
    template: '<p ng-transclude>{{ParagraphViewModel.text}}</p>'
  }
});

我在我的html中使用该指令如下:

<paragraph>This is a very simple paragraph</paragraph>
<paragraph></paragraph>

我有一个输入,我已将其绑定到ParagraphViewModel.text

<input type="text" ng-model="ParagraphViewModel.text">

问题是,当我更改输入时,第二个<paragraph>会按预期更改,但第一个值不会更改。

请检查this JSBin以查看其实际效果。

2 个答案:

答案 0 :(得分:2)

再看一下docs,尤其是这个example

你看,当Angular在

中转换你的内容时
<paragraph>This is a very simple paragraph</paragraph>

它完全忘记了指令模板中的{{ParagraphViewModel.text}}绑定,因为<p ng-transclude>的所有内容都将被<paragraph>标记中的内容替换。

第二种情况正如您所期望的那样,因为内容替换不会发生,而Angular默认为模板中的内容。

答案 1 :(得分:1)

我猜你在这里尝试实现的是将指令传递给默认文本,然后使用绑定输入进行更改。

您可以通过使用隔离范围来实现这一目标。这是你应该怎么做的:

查看

<div ng-app="myApp">

  <paragraph pgtext="Foo" pgmodel="bar"></paragraph>
  <paragraph>{{bar}}</paragraph>
  <input type="text" ng-model="bar">

</div>

应用

angular.module('myApp',[]);

angular.module('myApp').directive('paragraph', function() {
return {
    restrict: 'E',
    transclude: true,
    scope: {
      pgmodel: '=',
      pgtext: '@'
    },
    template: '<p ng-transclude>{{pgmodel || pgtext}}</p>'
  }
});

DEMO: JSBin