ngModel不会将数据传递回指令中的父作用域

时间:2013-01-29 07:33:35

标签: angularjs directive

相关帖子,但没有帮助: Scoping issue when setting ngModel from a directive

编辑:Can I use ng-model with isolated scope?也无效。

我遇到了一些问题,但我想是以更复杂的方式。我想写一个不使用任何输入进行数据保存的下拉菜单。我宁愿让ngModel来处理它。

http://jsfiddle.net/QeM6g/6/

上面的jsFiddle示例显示了一个演示,其中上述方法不起作用。

// this is what should work but doesn't
ngModel.$setViewValue(value);
scope.$apply(attr.ngModel,value);

由于某种原因,ngModelController的范围是我的范围的兄弟。所以它不会将更改传递回父级。至少所有其他兄弟范围的行为与您期望的一样。即ng-change组合起来。

2 个答案:

答案 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