2015-02-23 100 views
2

我不能讓我的模型在我選擇一個選項時進行更新。如何在Angularjs中使用ng選項時更新ng模型?

這是我的觀點:

<select data-ng-model="period" ng-options="item.value as item.text for item in periodOptions"></select> 

在我controller.js我有以下幾點:

$scope.periodOptions = [ 
      { text: "This week", value: 'week' }, 
      { text:"This month", value: 'month '}, 
      { text:"This year", value: 'year' }, 
      { text:"All times", value: 'all-time '} 
     ]; 

$scope.Search = function() { 

      return $http({ 
       url: '/api/get', 
       method: 'GET', 
       params: { 
        period: $scope.period 
       } 
      }).then(function(response) { 
       console.log(response); 
      }, function(reason) { 
       alert(reason); 
      }); 
     }; 

的$ scope.period不採取選擇了該選項的值來自用戶。我花了很多時間在這方面,無法弄清楚爲什麼會發生這種情況。

+1

正常工作:http://plnkr.co/edit/5IHYM086JgMzlPdFfACo?p=preview – dfsq 2015-02-23 10:34:53

+0

http://jsfiddle.net/HB7LU/11190/ – 2015-02-23 10:36:45

+0

燦你使用params:{ 'period':$ scope.period } – JayKay 2015-02-23 10:37:30

回答

1

下面是一個應該工作的解決方案(注意對你現有的代碼使用ng-options="item as item.text ...而不是ng-options="item.value as item.text)的一個小改動。希望這可以幫助!

var myCtrl = function($scope){ 
 
    
 
    $scope.periodOptions = [ 
 
      { text: "This week", value: 'week' }, 
 
      { text:"This month", value: 'month '}, 
 
      { text:"This year", value: 'year' }, 
 
      { text:"All times", value: 'all-time '} 
 
     ]; 
 
    
 
$scope.Search = function() { 
 
alert('will call api with period: '+$scope.period.text); 
 
    /* 
 
      return $http({ 
 
       url: '/api/get', 
 
       method: 'GET', 
 
       params: { 
 
        period: $scope.period 
 
       } 
 
      }).then(function(response) { 
 
       console.log(response); 
 
      }, function(reason) { 
 
       alert(reason); 
 
      }); 
 
      */ 
 
     }; 
 
    
 
    }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app ng-controller="myCtrl"> 
 
<select data-ng-model="period" ng-options="item as item.text for item in periodOptions" ng-change="updatePeriod()"></select> 
 
    <div>{{period}} </div> 
 
    <button ng-click='Search()' >Search</button> 
 
    </div>

+0

好吧我現在明白了,我改變了這個調用: $ scope.Search = function(){ return $ http({url:'/ api/ranks/get', method:'GET' , PARAMS:{ 週期:$ scope.period.value }。 })然後(功能(響應){ },函數(原因){ 警報(原因); }); }; 但仍然$ scope.period是undefined?! – Besa 2015-02-23 10:57:05

+0

我不認爲你應該改變這一部分。請閱讀我上面的註釋。更新您選擇的* ng選項*。對於periodOptions「'中的項目,使用'ng-options =」項目作爲item.text。如果你可以發佈更多的代碼,那麼你可能會有更多的想法。請使用上面的代碼片段,並讓我知道。更新你的*'ng-options' * – amitthk 2015-02-23 11:45:54

+0

你寫的方法很有效。但我的問題是我有一個嵌套的範圍。所以我創建了另一個範圍並在其上放置了一段時間,其餘的過濾選項現在可以工作。 我會接受你的答案,因爲它在plnkr上工作,我的代碼中還有其他東西需要修復 – Besa 2015-02-23 12:48:49

0

select和ngOptions的代碼是正確的。不過,我假設你想要$scope.Search函數在每個選項更改上被調用。在這種情況下,你需要設置ngChange處理程序:

<select ng-model="period" 
     ng-options="item.value as item.text for item in periodOptions" 
     ng-change="Search()"> 
</select> 
+0

我其實有一個搜索按鈕,但是當我按下它時。它達到 params:{period:$ scope.period.value}})。 但它說$ scope.period是undefined – Besa 2015-02-23 11:03:47

+0

聽起來就像你有嵌套的範圍。是'ngInclude'或'ngIf'指令?如果是這樣,設置最高範圍的初始值應該有所幫助。在你的控制器中添加這個'$ scope.period ='''。 – dfsq 2015-02-23 11:13:18

+0

是的,我有一個嵌套的範圍。我修復了它 – Besa 2015-02-23 12:47:10

1

試試這個

<div ng-controller="MyCtrl"> 
    <select data-ng-model="period" ng-options="item.value as item.text for item in periodOptions"></select> 
    <span>period value=, {{period}}!</span> 
</div> 
2

在我的情況ng-model沒有更新,因爲我selectng-if一個元素中。

<div class="editor-panel" ng-if="editorEnabled"> 
    ... 
    <select ng-options="item as item.description for item in items" ng-model="selectedItem"/> 
    ... 
</div> 

ng-if創建另一個範圍和ng-model指的是在這個孩子的範圍,而不是預期的變量的變量。

要解決這個問題,我改變了ng-model="selectedItem"價值ng-model="$parent.selectedItem

+0

你救了我的命。 – isick 2017-08-30 19:37:14