我有这个repro http://embed.plnkr.co/nVCmukG5abpi1Y4ZHkrq显示当我点击'标题3'并在文本框中输入一个值,虽然输入的值显示反映在用户界面,当我点击'点击'按钮的范围属性$ scope.test没有任何内容。angularjs-ng-switch不绑定ng-model
我不知道ng-switch有什么问题,或者我做错了什么。帮助表示赞赏!
http://embed.plnkr.co/nVCmukG5abpi1Y4ZHkrq
我有这个repro http://embed.plnkr.co/nVCmukG5abpi1Y4ZHkrq显示当我点击'标题3'并在文本框中输入一个值,虽然输入的值显示反映在用户界面,当我点击'点击'按钮的范围属性$ scope.test没有任何内容。angularjs-ng-switch不绑定ng-model
我不知道ng-switch有什么问题,或者我做错了什么。帮助表示赞赏!
http://embed.plnkr.co/nVCmukG5abpi1Y4ZHkrq
这是一个范围内的继承问题,由于ng-switch
创建其自己的范围。
经常提出的一个建议是在模型上始终使用dot
。原因在于,当控制器作用域项目是对象而不是基元时,子作用域将创建对初始对象的引用。如果模型是原始的,它将不会更新原始模型。
例如:
<input ng-model="test.value" placeholder="pre" type="text" />
$scope.test={value:''}
另一种方法是使用$parent
在HTML模型标记:
<input ng-model="$parent.test" placeholder="pre" type="text" />
使用dot
方法是一个很好的做法,以避免这些问题,你不不需要考虑更深的嵌套范围。
使用test.value
为模型演示:http://plnkr.co/edit/CkiF55bLXsYzR6ZjcrJp?p=preview
关于模型dot
引用(读宝贵):https://github.com/angular/angular.js/wiki/Understanding-Scopes
这是因为你实际上创建NG-开关内部的子范围。因此,属于ngSwitch指令的作用域上存在另一个test
属性。它最初将显示来自其父范围的值,但是当您编辑它时,由于它是原始的,它只会编辑子项上的值,而不是父项。原型继承在这里不起作用(但这就是我们需要的)。
当您单击该按钮时,该按钮正在alerting/console.logging父范围上的属性...子项无法更改。
为了解决这个问题使用$parent.test
在你ngSwitch您的NG-模型属性:
一个片段:
<span class="pew" ng-switch-when="title2">
<input ng-model="$parent.test" placeholder="pre" type="text" />
{{test}}
</span>
我遇到类似的问题,我已经通过在控制器创建一个范围变量求解并用于ng-include
和ng-switch
。这样,如果你深嵌ng-include
与ng-switch
并继续,我们仍然可以直接使用该范围变量。
由于所有子作用域(在这里,ng-include
/ng-switch
)从父范围(通常,控制器范围)延伸,我们可以在这些子作用域访问父范围直接没有问题。
使用$parent
需要写这样$parent.$parent.$parent.someProp
任何理由这种行为?我花了三个小时试图找出它,因为我改变了手动显示/隐藏我的两个相同数据的视图到ng-switch3天和3个源代码控制版本之前,一切似乎都正常。我有一个select来为列表中选择的内容设置当前字符,并且该字符有一个任务列表。一切看起来都可以找到,但是当我点击我任务上的按钮时,它正在使用原始父字符。任何方式来访问点击方法中的子范围(我使用executeTask($索引))? – 2013-05-29 04:30:52