2

我有一个带有 2 个对象模型的表单控制器 model1:{name:"foo"} model2:{name:"model2"} 我创建了 2 个指令(都创建了隔离范围)。一个使用 model1 的 Element only 绑定,另一个使用 model2 的 Attribute only 绑定。

嵌套是这样的:

 <div myattibute="model2">
   <mytag my-model="model"></mytag>
 </div>

attribute only 指令没有模板,而 tag 指令有模板。

问题是我在模型的 mytag 指令中未定义。

1 . 有人能看到问题并在 plnkr 中解释吗?

http://plnkr.co/edit/Q23XqY?p=preview


部分解决方案: 一个工作示例添加一个空的 div 模板,只为 myattribute 指令添加 ng-transclude 使其工作。我要求这个属性指令在一个 div 上,我希望它可以放在任何 div、span 等上。这是工作示例: http ://plnkr.co/edit/z0M5ys?p=preview

2 .ng-transclude 是如何影响作用域继承的?
3 .我不能只用业务逻辑而不用任何标记来创建这个属性吗?

4

1 回答 1

1

最好避免使用隔离范围,除非在极少数情况下它们会增加不必要的复杂性。使用 $scope.$watch 绑定到属性中的表达式要简单得多,如下所示:

$scope.$watch(attrs.myModel, function(newValue, oldValue) {})

$scope.$watch(attrs.myattribute, function(newValue, oldValue) {})

这样,您的指令可以共享声明它们的父作用域并使用 $watch 表达式处理对其的绑定,或者{ scope: true }如果需要,它们可以使用创建子作用域。

这是一种可能的解决方案:http ://plnkr.co/edit/mm2q67?p=preview

请记住,如果您真的想这样做,您的myTag指令可以myattribute使用隔离范围,但不能这样做会破坏范围继承链myTag

于 2013-10-26T16:56:50.000 回答