对于某些代码,这不是一个问题,但更多的是我的理解。如果这不合适,请原谅我。
我正在玩一个简单的复选框,其中指定了ngModel:
<input type="checkbox" ng-model="someFlag"/>
我希望这会将复选框的布尔值绑定到$ scope.someFlag(如果控制器和其他所有配置都正确)。 是的,它确实有效。但有时我发现这不起作用。案例:当someFlag更改时(例如在$ watch中)尝试执行某些操作时,该值并未真正绑定。
但后来,我遇到了一些工作中提到的工作:
使用包装器对象
这样做现在可以毫无问题地工作:
<input type="checkbox" ng-model="wrapperObject.someFlag"/>
观看$ scope.wrapperObject.someFlag按预期工作。
现在的问题是:为什么?
答案 0 :(得分:3)
当执行ngModel
指令时,它会读取属性的ng-model
值(在本例中为"someFlag"
)并将其保存在其本地函数范围内(不要混淆角度{{1} }})。但由于javascript中的$scope
是基元,因此不能通过引用传递它,只能通过值传递。这意味着只有boolean
的值($scope.someFlag
或true
)被复制到false
,而不是从{{ngModel
访问和修改$scope.someFlag
的方式1}}。
当你使用包装器对象时,它通过引用传递,这意味着在ngModel
和$scope.wrapperObject
的本地函数范围内它是相同的,因为它指向相同的内存地址在幕后。
我不确定这个解释是否足够,但是当使用angular中的原始值时,你必须记住传递引用和值之间的区别,以及当原语发生变化时,应用程序的其他部分可能不知道这一点
答案 1 :(得分:2)
看看这张取自Egghead.io的视频,您的问题已解释为here。
答案 2 :(得分:1)
根据我的理解,如果选中复选框到控制器
,则要传递布尔值试试这个: 在你的HTML中:
<input type="checkbox" ng-model="value"
ng-true-value="YES" ng-false-value="NO"> <br/>
在您的控制器中:
$scope.value is gives Boolean value//
答案 3 :(得分:1)
这是因为范围继承。关于angularjs范围和继承的好article
我猜您提到的$watch
逻辑可能是从ng-repeat
或ng-if
内部触发的。请记住angularjs为ng-repeat
和ng-if
内的每个对象创建一个新的范围变量。
<input type="checkbox" ng-model="someFlag"/> //This is a primitive $scope.someFlag
<input type="checkbox" ng-model="obj.someFlag"/> //This is an object $scope.obj.someFlag
<div ng-repeat="opt in options">
这里为opt变量创建了一个新的子范围 - $scope.somechild
。
因此,如果在此引用原始变量someFlag
,则将其视为$scope.child.someFlag
。所以此处的任何更新都不会更新父$scope.someFlag
。
但是如果对象继承引用了对象obj.someFlag
,编译器将尝试在子代码$scope.child
中找到obj.someFlag,因为它不存在它将在父$scope
中搜索,因为它是目前,这将引用$scope.obj.someFlag
,此处所做的任何修改都是在实际的父范围内完成的。
答案 4 :(得分:1)
这是口头禅的一部分:&#34;模型中应该总是有一个点&#34;作者:Misko Hevery,Angular的父亲之一。您可以,也可能应该观看此视频:https://www.youtube.com/watch?v=ZhfUv0spHCY&feature=youtu.be&t=32m51s
ngModel
是一个执行双向数据绑定的指令。绑定到基元(在本例中为布尔)将使setter将其设置在当前作用域上,而不是放在可能会干扰其他作用域的作用域上。
在您的方案中,在父作用域中,我们有$scope.someFlag = true
。在子范围内,我们会输入您的信息:
<input type="checkbox" ng-model="someFlag"/>
这将最初起作用,但是一旦用户更改了值,将在子范围上创建someFlag
,并且从现在开始,绑定将从该值读取和写入。
我希望这在某种程度上是明确的。
请注意,这仅适用于双向数据绑定指令,而不是ngDisabled
或ngHide