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

Ric*_*rdt 9 directive angularjs

相关帖子,但没有帮助: 从指令设置ngModel时的范围问题

编辑:我可以使用具有隔离范围的ng模型吗?也没用.

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

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

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

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

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

bml*_*ite 22

Angularjs与直接绑定到基本类型的处理不太好.

如果您更改此行:

$scope.productId = 16;
Run Code Online (Sandbox Code Playgroud)

这样的事情:

$scope.selectedProduct = {
    id: 16
}
Run Code Online (Sandbox Code Playgroud)

并且在其余代码上更改这些引用,您应该能够克服该问题.

jsFiddle: http ://jsfiddle.net/M2cL7/


小智 6

不要绑定到作用域中的基元,绑定到作用域中的对象.

来自https://github.com/angular/angular.js/wiki/Understanding-Scopes

......直到你尝试2路数据绑定(即,表单元素,NG-模型)从孩子域内父范围定义为一种原始的(例如,数字,字符串,布尔值).它不像大多数人期望的那样工作.会发生什么是子范围获取其自己的属性,该属性隐藏/隐藏同名的父属性.这不是AngularJS正在做的事情 - 这就是JavaScript原型继承的工作原理.新的AngularJS开发人员通常没有意识到ng-repeat,ng-switch,ng-view和ng-include都会创建新的子范围,因此在涉及这些指令时经常会出现问题.

通过遵循始终具有'.'的"最佳实践",可以轻松避免与原语的这个问题.在您的ng模型中

所以

<input ng-model="tweetText">
Run Code Online (Sandbox Code Playgroud)

<input ng-model="tweet.text">
Run Code Online (Sandbox Code Playgroud)

这里有一个很好的总结:

https://www.youtube.com/watch?v=ZhfUv0spHCY&feature=youtu.be&t=30m