相关帖子,但没有帮助: Scoping issue when setting ngModel from a directive
编辑:Can I use ng-model with isolated scope?也无效。
我遇到了一些问题,但我想是以更复杂的方式。我想写一个不使用任何输入进行数据保存的下拉菜单。我宁愿让ngModel来处理它。
上面的jsFiddle示例显示了一个演示,其中上述方法不起作用。
// this is what should work but doesn't
ngModel.$setViewValue(value);
scope.$apply(attr.ngModel,value);
由于某种原因,ngModelController的范围是我的范围的兄弟。所以它不会将更改传递回父级。至少所有其他兄弟范围的行为与您期望的一样。即ng-change组合起来。
答案 0 :(得分:22)
Angularjs与直接绑定到基本类型的处理不太合适。
如果您更改此行:
$scope.productId = 16;
这样的事情:
$scope.selectedProduct = {
id: 16
}
并在其余代码上更改这些引用,您应该能够克服这个问题。
jsFiddle: http://jsfiddle.net/M2cL7/
答案 1 :(得分:6)
不要绑定到作用域中的基元,绑定到作用域中的对象。
来自https://github.com/angular/angular.js/wiki/Understanding-Scopes
...直到你尝试双向数据绑定 (即表格元素,ng-模型)到基元(例如,数字,字符串, boolean)在子范围内从父范围定义。它 不像大多数人期望的那样工作。怎么了 是孩子范围得到自己的隐藏/阴影的属性 同名的父属性。 这不是AngularJS的内容 做 - 这就是JavaScript原型继承的工作方式。新 AngularJS开发人员通常没有意识到ng-repeat,ng-switch, ng-view和ng-include都创建了新的子范围,所以问题就出现了 经常出现在涉及这些指令的时候。
通过遵循以下原则,可以轻松避免使用原语这个问题 “最佳实践”总是有'。'在你的ng模型中
所以
<input ng-model="tweetText">
变为
<input ng-model="tweet.text">
这里有一个很好的总结:
https://www.youtube.com/watch?v=ZhfUv0spHCY&feature=youtu.be&t=30m