2014-04-01 84 views
0

我有一個人物對象列表,我想綁定到一個select元素。angularjs ng-model和ng-select奇怪行爲

控制器實現:

// Person controller 
function PersonCtrl($scope) { 
    $scope.persons = [{id: 1, name: 'alex'}, {id: 2, name: 'jhon'}]; 
    $scope.selectedPerson = {id: 2, name: 'jhon'}; 
} 

HTML標記:

<select ng-model="selectedPerson" ng-options="p.name for p in persons"></select> 

的問題是結合似乎只能從HTML的範圍,而不是周圍的其他方式工作。如果我從下拉列表中選擇一個項目,它將正確更新$ scope.selectedPerson。但是,如果我最初將$ scope.selectedPerson變量的值設置爲人員列表中的一個對象,則該值不會反映在選擇控件上。

我也有小提琴,準確顯示的問題是什麼:http://jsfiddle.net/nE3gt/

預先感謝您!

回答

0

您需要的selectedPerson設置到人員數組中的元素,而不是一個新的對象 - 否則Angular不知道它們是同一件事。

// Person controller 
function PersonCtrl($scope) { 

$scope.persons = [{id: 1, name: 'alexx'}, {id: 2, name: 'jhon'}]; 

$scope.selectedPerson = $scope.persons[1]; 

$scope.submit = function() { 
    //console.log(JSON.stringify($scope.Person)); 
    $("#obj").text(JSON.stringify($scope.Person)); 
}; 

}

更新小提琴:http://jsfiddle.net/nE3gt/2/

編輯

如果我正確認識你,你想要做的東西沿着這些路線:

// Person controller 
function PersonCtrl($scope) { 

    //serverData is the result of some http request... 
    var serverData = {persons: [{id: 1, name: 'alexx'}, {id: 2, name: 'jhon'}], selectedPerson: {id: 2, name: 'jhon'}}; 

    $scope.persons = serverData.persons; 
    $scope.selectedPerson = null; 

    //find obj in persons that equals selectedPerson 
    for(var i = 0, l = serverData.persons.length; i < l; i++) 
    { 
     if(serverData.persons[i].id === serverData.selectedPerson.id) 
     { 
      $scope.selectedPerson = serverData.persons[i]; 
     } 
    } 

    $scope.submit = function() { 
     //console.log(JSON.stringify($scope.Person)); 
     $("#obj").text(JSON.stringify($scope.Person)); 
    }; 
}; 

即使y我們的數據將作爲不同的對象返回,以確保您將selectedPerson設置爲persons數組中的項目。

新小提琴:http://jsfiddle.net/nE3gt/4/

+0

嗨,感謝您的回答!問題是,我正在服務器上構建一個複雜的模型,這是我設置選定對象的位置,並填充了可能的選項。這是唯一的方法嗎? –

+0

你的意思是從服務器返回的數據類似'{persons:[{id:1},{id:2},{id:3}],selectedPerson:{id:2}}'? – brianj

+0

是的,就是這樣。可以在這裏使用像ng-init這樣的東西嗎? –