2014-09-24 78 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