2013-10-22 33 views
2

我有一个带有2个对象模型model1的表单控制器:{name:“foo”} model2:{name:“model2”} 我创建了2个指令隔离范围)。一个使用model1的Element only绑定,另一个使用仅使用model2的Attribute only绑定。Angularjs将2个指令作用域模型绑定到父控制器模型

的嵌套像这样:

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

的属性只指令不具有模板和标签指令有一个模板。

问题是我在模型的mytag指令中出现undefined。

。有人看到问题并在plnkr中解释它吗?

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


部分解决: 与该myattribute指令使得它的工作只NG-transclude添加一个空的DIV模板的工作的例子。随着我授权该属性指令是在一个div它,我会希望它能够在任何可放置的div,跨度等 这里是工作示例: http://plnkr.co/edit/z0M5ys?p=preview

。如何为NG-transclude影响范围继承?
。无法用没有标记的业务逻辑创建此属性吗?

回答

1

最好避免隔离范围,除非极少数情况下会增加不必要的复杂性。这是很简单,只需使用$范围$表绑定到表达式的属性是这样的:

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

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

这样,你的指令可以共享他们在被宣布父范围和处理使用$腕表结合它表达式,或者如果需要,他们可以使用{ scope: true }创建子范围。

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

请记住,你myTag指令可以使用分离的范围,如果你真的想这样做的,但myattribute一个不能为将打破范围继承链myTag

+0

有趣的一点。我试图实现的是分层组件。例如,一个组件只能包含其中的其他组件的布局信息,而属性则用于额外的业务UI逻辑而无需演示。你认为你的模型适合吗? (因为你可以看到,即使在一个简单的例子中,我遇到了'='绑定的一些问题) –

+0

绝对不需要隔离作用域。 Angular核心几乎从不在任何地方使用它们。不是说你永远不会想要他们,但通常没有必要。看看指令控制器是如何工作的。你可以有一个根控制器,你的“子”指令也可以有一个引用,并与根交互。 ngForm和ngModel指令可以做到这一点。 –

+0

哦,你也应该考虑你的指令*通常应该主要是表示逻辑,业务逻辑应该存在于服务中。当然,指令可以自由使用这些服务。 –

相关问题