2013-06-16 3 views
2

У меня возникли проблемы с использованием модуля Select2 в AngularJS. Я могу загрузить объекты в порядке и получить выбранный элемент из моей ng-модели, но у меня есть проблемы, что выпадающий список не обновляется, если я обновляю ng-модель.Двухсторонняя привязка данных в Select2 для AngularJS не работает

На мой взгляд, код выглядит следующим образом:

<select ui-select2 data-placeholder="All" id="filtersSelect" ng-model="chosenFilterItem" ng-options="item.text for item in filterItems"> 

В мой контроллер у меня есть следующий код, который извлекает элементы и связывает его в список:

$scope.fetchFilters = function(){ 
     $http.get($scope.filtersUrl).then(function(result){ 
      $scope.filterItems = result.data; 
      $scope.chosenFilterItem = result.data[3]; 
      if(!$scope.$$phase) { 
       $scope.$apply(); 
      } 
     }); 
    } 

Как вы можете см. Я просто пытаюсь установить третий элемент в раскрывающемся списке, но ни один элемент не выбран. Есть ли другой способ выбора выделенного пункта?

+0

Пожалуйста, не рекомендуется использовать точечную нотацию, поэтому сохраняйте свои данные в одной переменной, например. 'Data'. Для получения дополнительной информации см. Этот учебник по видео Egghead.io: http://goo.gl/373Ia – Voles

ответ

6

Angular-ui/ui-select2 GitHub страницы гласит:

щ-Выбор2 несовместима с <select ng-options>. Для лучших результатов используют <option ng-repeat>.

Таким образом, чтобы спасти себя от головной боли я также рекомендую использовать варианты с нг-повтора как в:

$scope.filterItems = [ 
    {id: 1, text: 'Item1'}, 
    {id: 2, text: 'Item2'}, 
    {id: 3, text: 'Item3'}, 
    {id: 4, text: 'Item4'} 
]; 

<select ui-select2 placeholder="All" ng-model="chosenItem"> 
    <option value=""></option> 
    <option ng-repeat="item in filterItems" value="{{item.id}}">{{item.text}}</option> 
</select> 

DEMO PLUNKER

+0

Моя ошибка была в два раза. Я использовал ng-options, и я установил $ scope.chosenFilterItem как элемент, заданный элементом. – Dofs

1

Стьюи разместил Rigth способ реализации ВЫБ.2, но он использует " статические "элементы.

Разница заключается в том, что угловой визуализирует select2 перед тем, как элементы, вызванные через ajax, поэтому в этом случае вам нужно добавить инструкцию ui-if, чтобы добавить директиву только после того, как у вас есть данные.

<select ui-select2 placeholder="All" ng-model="chosenFilterItem" **ui-if="filterItems.length>0"**> 
<option value=""></option> 
<option ng-repeat="item in filterItems" value="{{item.id}}">{{item.text}}</option> 
</select> 

Если он не работает, пожалуйста, создайте jsfiddle с Аяксом пунктов погрузки и я буду там работать!

+0

На самом деле, [это демо] (http://plnkr.co/edit/dMSNQB?p=preview) доказывает, что select2 также забирает отложенные элементы. – Stewie

+0

Я думаю, что Dofs требует начального предварительного выбора элемента внутри директивы select2. Он работал бы, но «эффект» wold был начальным пустым значением, и после завершения ajax он выглядит правильно. Использование ui - если просто скрыть начальное пустое значение. – Akallabeth

+0

Несомненно, но его вопрос заключается не в том, чтобы скрыть элемент до загрузки данных. – Stewie

Смежные вопросы