2014-09-24 88 views
1

我正在学习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课程'学生突出'。我想在用户点击'submit'按钮后在视图中更改'isStudent'值。

为了做到这一点,我用$$ childHead控制器:

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

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

请帮我一把!

+0

IsStudent是您的范围的变量吗? – 2014-09-24 14:08:08

+0

这是一个在视图中的子范围 – 2014-09-24 14:17:45

+0

因此在控制器中,没有。 – 2014-09-24 14:18:04

回答

1

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

+0

哦哇这种方法是好的。 – 2014-09-24 15:17:07

+0

您认为我可以使用$ scope。$ broadcast()触发方法checkStudent()吗? – 2014-09-24 15:18:41

+1

为什么你需要播放? – jd17 2014-09-24 15:29:59

1

一种方法是在控制器中有一个bools = {}对象。然后,您的视图和您的控制器可以简单地访问bools.isStudent获取当前值。当您迁移到首选的Controller As语法时,这会变得更好。

另外,您不应该使用任何$$属性,因为它们是私有的。从documentation

$前缀命名约定

您可以创建自己的服务,而事实上,我们将会做的是在第11步作为一个命名约定,角的内置服务,范围方法和其他一些Angular API在名称前有一个$前缀。

$前缀是有名称空间Angular提供的服务。为了避免冲突,最好避免命名你的服务和模型以$开头的任何东西。

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

+1

另外,你不应该需要$ broadcast或$ emit。如果你想使用这些,你应该看指令和服务。 – Owen 2014-09-24 15:20:16

+0

我明白了。那需要多一点记忆。谢谢! – 2014-09-24 15:22:30

+1

Angular是那些开始很快,很难掌握语言的人之一。那里有很多样品。欢迎来到这个语言,祝你旅途顺利。 – Owen 2014-09-24 15:24:24