ng-onclick似乎知道$ scope之前的变化

时间:2015-12-15 23:51:37

标签: angularjs angularjs-scope

我一直遇到一个问题,我需要通过ng-click传递$ scope上的属性,以便在ng-click方法中访问该属性。其中一个问题是$ scope.rejectionMessage似乎永远不会更新。

HTML部分:

<label class="item item-input">
    <input
        type="text"
        ng-model="rejectionMessage"
        ng-change="logWTF(rejectionMessage)"
        placeholder="Enter rejection message here."
    >
</label>
<button
    type="button"
    class="button button-block button-outline button-assertive"
    ng-click="rejectChild(rejectionMessage)"
>
    REJECT
</button>

控制器部分:

$scope.logWTF = function(rejectionMessage){
    console.log($scope.rejectionMessage) // messageA
    console.log(rejectionMessage) // messageB
} 

messageA($ scope.rejectionMessage)始终为空字符串,但messageB始终是输入中当前输入的内容。

html只有一个控制器但仍然显示我有2个独立的$ scope对象。我调试了这个并查看了所有相关的$ parentScopes,并且没有发现rejectionMessage属性隐藏在任何意外的地方。

一个简单的解决方案是通过按钮ng-click方法通过函数传递属性,但我有其他依赖于$ scope.rejectionMessage的函数。我可以一直通过它,但是它带走了很多Angular的价值。另外我对Angular来说相对较新,觉得这对我来说是一次很棒的学习经历。

编辑:我刚学会了所有形式的名字=&#39;东西&#39;使用单独的控制器,因此有自己的$ scope。

1 个答案:

答案 0 :(得分:1)

如果input位于控制器范围的子范围内,则会发生这种情况。它被称为原型继承:阅读$scope.foo在原型链中向上读取,但写入$scope.foo会将其设置在该确切范围内。因此input会将其设置在子范围内,与按钮相同,但与控制器不同。

这里的经验法则是在控制器的范围上设置一个对象,例如: $scope.model = {};,并将ng-model更改为model.rejectionMessage。然后,您确定自己指的是控制器范围的rejectionMessage。有人说&#34;每个ngModel应该有一个点&#34;,因为这个。