2015-10-13 98 views
1

我有一個表單,您可以在其中添加x個字段。每個字段包含選項選擇。如果此選項在之前的一個或多個字段中已被選中,我想過濾掉已經選擇的選項。每個字段都有一個刪除按鈕,表單有1個添加按鈕。AngularJS過濾器已從動態字段中選擇選項

如何過濾動態字段? 任何幫助,指導是最受歡迎的。提前感謝。 :)

這是我的HTML看起來像:

<div data-ng-repeat="choice in choices"> 
      <select data-ng-model="choice.option" 
        data-ng-options="item as item.Value for item in options"> 
      </select> 
      <button data-ng-click="removeChoice(choice)">Remove choice</button> 
     <div> 
      <button data-ng-show="choices.length <= 4" data-ng-click="addNewChoice()">Add Choice</button> 
     </div> 
</div> 

而且我的控制器:

 $scope.options = [ 
      { 
       "Key": "0", 
       "Value": "Select an option" 
      }, 
      { 
       "Key": "Option1", 
       "Value": "Option1" 
      }, 
      { 
       "Key": "Option2", 
       "Value": "Option2" 
      }, 
      { 
       "Key": "Option3", 
       "Value": "Option3" 
      }, 
      { 
       "Key": "Option4", 
       "Value": "Option4" 
      }, 
      { 
       "Key": "Option5", 
       "Value": "Option5" 
      } 
     ]; 


     $scope.choices = [{ id: '1' }]; 

      $scope.addNewChoice = function() { 
       var newItemNo = $scope.choices.length + 1; 
        $scope.choices.push({ id: newItemNo, option: $scope.option, value: $scope.value }); 
      }; 

      $scope.removeChoice = function() { 
       var index = $scope.choices.indexOf(choice); 
       $scope.choices.splice(index, 1); 
      }; 

+0

你是說一個新的'choice'你應該還沒有在其他選項中選擇獨特的'options'?什麼是'$ scope.option'(no ** s **)?這只是一個錯字嗎? –

+0

確切地說,您所做的選擇不應在下一個選項中提供。它應該被過濾掉。你是什​​麼意思(不是)?我推$ scope.option,$ scope.value和ID來添加一個新選項。 – Wanwan

+0

對不起,我有點忙。我已經爲此編寫了一個解決方案,可以請您創建一個簡單的plunkr,以便我可以將這些東西放在那裏。 –

回答

0

確定 我可以給簡單的建議,這將是這一點。

1:添加變量$ scope.selectedOptions = []; 這將包含所有選擇元素中已經選擇的選項列表。

2:create function $ scope.AddSelectedOption(item); 當我們改變任何選擇元素的選項時,這將添加所選對象,因爲我們將用於所有選擇ng-change =「AddSelectedOption(item);」 3:添加checkIfSelected(item);添加checkIfSelected(item);添加checkIfSelected(item);添加checkIfSelected(item);添加checkIfSelected(item);添加checkIfSelected(item);添加checkIfSelected(item);這將檢查是否給定對象的值已被選中或不..

將用戶希望你明白它的作用只是檢查像這樣

$ scope.checkIfSelected =功能(項目){

$ scope.selectedFound = $ scope.selectedOptions.filter(功能 (選項){ 如果(option.value == item.value) { 迴天; }
});
if($ scope.selectedFound.length == 0){return false; } else { return true; }

}

如果給的選項中項目這將返回true。 如果沒有......你可以邀請我再次幫忙。

+0

如何過濾已選擇的選項?因爲如果我從$ scope.option中過濾出來,選擇的選項也會消失。我現在擁有將在更改時更新的selectedOptions。但我不知道如何過濾這個選項。 – Wanwan

0

這是可能的。我正在解釋這個要求的基本版本。請參閱此處的工作示例http://plnkr.co/edit/S9yZpjhY55lXsuifnUAc?p=preview

正在做什麼是維護另一個options,它是原始options的副本。複製options將使其不會引用現有選項,因爲對象是通過Javascript中的引用傳遞的。

主要的邏輯是這樣的功能,其修改選擇options

$scope.optionSelected = function(choice) { 
    $scope.availableOptions = $scope.availableOptions || angular.copy($scope.options); 

    if (choice.option) { 
     var index = -1; 
     // See if available options has that key 
     angular.forEach($scope.availableOptions, function(item, i) { 
      if (item.Key === choice.option.Key) { 
       index = i; 
      } 
     }); 

     if (index > -1) { 
      // And then remove it 
      $scope.availableOptions.splice(index, 1); 
     } 
    } 
}; 
+0

嗨,thnx回答,這從你從上到下選擇時適用。當您選擇第一個選項時,然後選擇第二個選項,並且您想要再次更改第一個選項時,所有選項仍可用。 – Wanwan

+0

好的,這可以進一步改變。就像我說的,我給了你一個簡單的例子。所以,現在改變任何選擇選項,你可以增加迭代遍歷所有選擇並移除選擇的'availableOptions'。我知道這個問題,但留給你:-) –