更改视图中的范围值

时间:2014-09-24 13:47:56

标签: angularjs angularjs-scope angularjs-ng-repeat

我正在学习AngularJS,我有一个问题。

这是我的代码:

HTML(查看):

...
<table>
    <tr ng-repeat="student in students">
        <td ng-class="{'student-highlight' : isStudent}">
            <input  type="checkbox"
                    ng-model="student.option"
                    ng-change="isStudent = checkStudent(student)" />
        </td>
 ...
<button type="button" ng-click="submit()">SUBMIT</button>

控制器:

$scope.checkStudent = function(student) {
    if(some_logic)
        return true; // It returns true for now
    else
        return false;
};

$scope.submit = function() {
    // I want to change isStudent in the view to false
};

因此,当用户更改输入框时,它返回true,因此CSS类会突出显示单元格&#39;学生突出显示&#39;。我想改变价值&#39; isStudent&#39;在用户点击按钮后的视图中提交&#39;。

为此,我在控制器中使用了$$ childHead:

for(var cs = $scope.$$childHead; cs; cs = cs.$$nextSibling) {
    if(cs.isStudent)
        cs.isStudent = false;
}

但我不喜欢我在这里做的事情 - 它并不漂亮。我想我可以使用$ scope。$ emit()或$ scope。$ broadcast(),但我不知道如何。

请帮帮我!!

2 个答案:

答案 0 :(得分:1)

也许您可能想看一下Angularjs表单验证。
首先,在input.ng-dirty下定义学生突出显示 然后要清除学生突出显示,您可以在submit()中调用$ scope.form。$ setPristine()来重置表单。

答案 1 :(得分:1)

执行此操作的方法是在控制器中使用bools = {}对象。然后,您的视图和控制器可以只访问bools.isStudent获取当前值。当您迁移到首选的Controller As语法时,这会变得更好。

顺便说一句,你不应该使用任何$$属性,因为它们是私有的。来自documentation

  

$ Prefix Naming Convention

     

您可以创建自己的服务,事实上我们将在第11步中完成。作为命名约定,Angular的内置服务,Scope方法和一些其他Angular API在名称前面都有$前缀

     

$前缀用于命名空间Angular提供的服务。为了防止冲突,最好避免命名您的服务并模拟以$开头的任何内容。

     

如果您检查Scope,您可能还会注意到一些以$$开头的属性。这些属性被视为私有,不应被访问或修改。