我已根据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以查看其实际效果。
答案 0 :(得分:2)
你看,当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