9

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

编辑:我可以使用具有隔离范围的 ng-model 吗?也没有用。

我遇到了一些问题,但我猜是以更复杂的方式。我想编写一个不使用任何输入来保存数据的下拉菜单。我宁愿让 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 结合使用。

4

2 回答 2

23

Angularjs 不能很好地处理与原始类型的直接绑定。

如果您更改此行:

$scope.productId = 16;

像这样:

$scope.selectedProduct = {
    id: 16
}

并更改其余代码的这些引用,您应该能够克服这个问题。

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

于 2013-01-29T10:55:39.947 回答
7

不要绑定到作用域中的原语,绑定到作用域中的对象。

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

...直到您尝试将 2 路数据绑定(即,表单元素,ng-model)到从子范围内定义在父范围上的原语(例如,数字,字符串,布尔值)。它不像大多数人期望的那样工作。发生的情况是子作用域获得了自己的属性,该属性隐藏/隐藏了同名的父属性。这不是 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

于 2016-05-31T18:05:16.000 回答