2014-10-01 77 views
0

我有一組需要監視的下拉列表。一旦下拉列表中有一個未定義的值(即一個默認值),那麼我們應該使用這些值來觸發ajax請求。我的手錶組代碼如下。

$scope.$watchGroup([ 
     'formData.DDL1', 
     'formData.DDL2', 
     'formData.DDL3'], 
     function (newValues, oldValues, $currentScope) { 
      // If any of the new values are undefined, then do *not* fire a new request 
      for (var i in newValues) { 
       if (newValues[i] === undefined) 
        return; 
      } 

      DataService.getData(newValues[0], newValues[1], newValues[2]) 
       .then(function (data) { 
        $currentScope.data = data; 
       }); 
     }); 

     <label for="ddl1" class="control-label pull-left">DDL1</label> 
     <select ng-model='formData.DDL1' 
       class='form-control' 
       ng-options='option.id as option.name for option in options' 
       required 
       name='DDL1'> 
      <option value=''>Please select an option.</option> 
     </select> 

不幸的是由於某種原因,每次我改變下拉列表(即,只是選擇不同的選項) - 下面的例子DDL - 然後$watchGroup調用回調的兩倍。這導致了奇怪的行爲,因爲$currentScope.data將回調中的數據連接到自身(而不是破壞性分配,這是您可以看到我已經放入的)。

顯然,$watchGroup是角1.3.X(我目前使用1.3.0-rc.1),這仍然是邊緣,所以我期待一些問題。是否有其他人遇到這個問題和/或解決它?

爲簡潔起見,名稱已被替換。

+0

我看不到你在$ watchGroup中的任何地方使用「oldValues」,那麼爲什麼你不能擺脫$ watchGroup並在你的select中使用ng-change呢? – Josep 2014-10-01 14:03:47

+0

我需要監視多個選擇,'$ watchGroup'似乎是最習慣的方式。它肯定減少了代碼重複。 'oldValues'是'$ watchGroup'傳入的參數之一,雖然我可以將其明確地分配給'_',但我決定不會:p – 2014-10-01 14:06:51

+0

看起來'$ watch'被潛在地多次調用, $ digest'循環,所以'$ watchGroup'也一樣。 'ngChange'是去這裏的路,但爲什麼會出現這種情況呢?有沒有辦法解決這個問題,還是我總是需要使用一個指令? – 2014-10-01 14:19:20

回答

0

我認爲你的代碼應該是這個樣子:

控制器:

$scope.ddlUpdated = function(){ 
    DataService.getData($scope.formData.DDL1, $scope.formData.DDL2, $scope.formData.DDL3) 
       .then(function (data) { 
        $currentScope.data = data; 
       }); 
} 

查看:

<label for="ddl1" class="control-label pull-left">DDL1</label>    
    <select ng-model='formData.DDL1' 
      class='form-control' 
      ng-options='option.id as option.name for option in options' 
      required 
      name='DDL1' ng-change="formData.DDL1 && ddlUpdated()"> 
     <option value=''>Please select an option.</option> 
    </select> 

我不會在控制器中使用 「手錶功能」 ,我會改爲在您的3個不同的selects中使用ngChange directive

使用「監視」功能的最常用方法是在自定義指令的鏈接函數內,但您不需要自定義指令,因爲Angular已經向我們提供了可用於通知的ngChange指令在視圖中發生變化的控制器。讓我們這樣說吧:在Angular中,控制器通過指令生成它在視圖中消耗的模型,但是當視圖中的事件「正在發生」時,指令也負責與控制器進行通信。

相關問題