Angularjs 绑定 2 指令将模型范围限定为父控制器模型



我有一个带有 2 个对象模型的表单控制器 model1:{name:"foo"} model2:{name:"model2"}我创建了 2 个指令(两者都创建了隔离的作用域)。一个使用模型 1 的仅元素绑定,另一个使用模型 2 的仅属性绑定。

嵌套是这样的:

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

仅属性指令没有模板,而标签指令具有模板。

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

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

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


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

2.ng-transclude如何影响范围继承?
3.我不能只用没有任何标记的业务逻辑创建此属性吗?

最好避免隔离作用域,除非在极少数情况下它们会增加不必要的复杂性。仅使用 $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的作用域继承链

最新更新