2015-03-15 2 views
5

Добрый день!AngularJS и UI-Выбрать несколько с данными

Я пытаюсь использовать UI-Select, чтобы заполнить форму, связанную с моделью. данные Модель получена с сервера с помощью контроллера следующим образом:

<form action="index.php" method="post" class="form-horizontal" ng-controller="WorkPlanController as ctrl" ng-init="init(6)"> 

<!-- this work perfectly! --> 
    <textarea name="workplan_approver_post" ng-model="workplan.approver_post"></textarea> 

<!-- here I have troubled --> 
<div ng-controller="LookupController as lookupCtrl" ng-init="lookupCtrl.initLookup('corriculum_speciality_directions')"> 
<ui-select ng-disabled="disabled" multiple ng-model="workplan.profiles" theme="select2"> 
<ui-select-match placeholder="Выберите значение из списка">{{$item.value}}</ui-select-match> 
<ui-select-choices repeat="item.key as item in items track by $index | filter: $select.search"> 
<div ng-bind-html="item.value | highlight: $select.search"></div> 
</ui-select-choices> 
</ui-select> 
</div> 

</form> 

WorkPlanController является простой REST-сервис:

application 
    .controller("WorkPlanController", [ 
     '$scope', 
     'WorkPlan', 
    function($scope, workPlanFactory){ 
     $scope.workplan; 
     $scope.workplan = { 
      profiles: [] 
     }; 
     $scope.init = function($id){ 
      workPlanFactory.get({id: $id}, function(data){ 
       $scope.workplan = data; 
      }); 
     }; 

     $scope.save = function(){ 
      $scope.workplan.$save(); 
     } 
    }]); 

application 
    .factory('WorkPlan', function($resource){ 
     return $resource(web_root + "_modules/_corriculum/workplans.php", { 
      model: "CWorkPlan", 
      type: "json" 
     }, { 
      get: { 
       method: "GET", 
       params: { 
        id: '@id', 
        action: "get" 
       } 
      } 
     }); 
    }); 

сервер принимает объект плана работы следующим образом:

{"id":"5","title":"title","department_id":"0","approver_post":"","approver_name":"","discipline_id":"402","corriculum_discipline_id":"566","direction_id":"79","qualification_id":"220","education_form_id":"0","year":"2015","author_id":"311","profiles":[]} 

Также я использую LookupController, который является тем же:

application 
    .factory("LookupCatalog", function($resource){ 
     return $resource(web_root + "_modules/_search/", { 

     }, { 
      query: { 
       method: "GET", 
       isArray: true, 
       params: { 
        catalog: '@catalog', 
        action: "NgLookupViewData" 
       } 
      } 
     }); 
    }) 
    .controller("LookupController", [ 
     '$scope', 
     'LookupCatalog', 
     function ($scope, lookupCatalog) { 
      $scope.items; 

      this.initLookup = function (glossary) { 
       lookupCatalog.query({catalog: glossary}, function(data) { 
        $scope.items = data; 
       }); 
      } 
     } 
    ]); 

LookupController принимает данные в следующем виде:

[{"key":429,"value":"data1"},{"key":430,"value":"data2"},{"key":1743,"value":"data3"},{"key":1744,"value":"data4"},{"key":1852,"value":"data5"}] 

И все выглядит хорошо, то нг-модель workplan.profiles свойство пусто:

http://joxi.ru/n2YR57wS4jwOA6

Затем я сохранить данные на сервере , Угловая отправка ПОСТ со следующими данными:

{"id":"5","title":"title","department_id":"0","approver_post":"","approver_name":"","discipline_id":"402","corriculum_discipline_id":"566","direction_id":"79","qualification_id":"220","education_form_id":"0","year":"2015","author_id":"311","profiles":[430,430]} 

Я вижу, что профили - это массив ключей, и он в правильной форме. Но когда я пытаюсь загрузить эти данные обратно в модель и заполнить форму, я получаю много JS-ошибок:

Error: [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: $item in $select.selected, Duplicate key: undefined:undefined, Duplicate value: undefined 
http://errors.angularjs.org/1.3.2/ngRepeat/dupes?p0=%24item%20in%20%24select.selected&p1=undefined%3Aundefined&p2=undefined 
    at REGEX_STRING_REGEXP (angular.js:80) 
    at ngRepeatAction (angular.js:24167) 
    at Object.$watchCollectionAction [as fn] (angular.js:13909) 
    at Scope.$get.Scope.$digest (angular.js:14042) 
    at Scope.$get.Scope.$apply (angular.js:14304) 
    at angular.js:16035 
    at completeOutstandingRequest (angular.js:4842) 
    at angular.js:5215 
angular.js:11383 TypeError: Cannot read property 'search' of undefined 
    at uis.directive.link.ngModel.$formatters.unshift.checkFnMultiple (angular-select.js:1111) 
    at Array.<anonymous> (angular-select.js:1125) 
    at Object.ngModelWatch (angular.js:20669) 
    at Scope.$get.Scope.$digest (angular.js:14034) 
    at Scope.$get.Scope.$apply (angular.js:14304) 
    at done (angular.js:9518) 
    at completeRequest (angular.js:9703) 
    at XMLHttpRequest.requestLoaded (angular.js:9646) 

http://dl2.joxi.net/drive/0009/3267/613571/150315/90c1afa060.jpg

Но я уже добавить трек условия для UI-Select-выбор повторение! Что я должен сделать, чтобы он работал правильно?

ответ

0

Я не уверен, каким образом вы собираетесь получать информацию от php, поскольку я делаю это несколько иначе, но следующий код - это способ использования простого ng-repeat с треком и массивом $ scope в файле js ,

ng-repeat можно использовать одинаково со многими различными элементами.

Вот простой способ использовать массив $ scope.choice в список элементов в раскрывающемся списке и выберите элемент

Если вы можете вернуть информацию в переменную $ области действия, то это должно помочь вам

index.html

<div ng-controller="DropdownCtrl"> 

    <!-- Single button --> 
    <div class="btn-group" uib-dropdown is-open="status.isopen"> 
     <button id="single-button" type="button" class="btn btn-primary" uib-dropdown-toggle ng-disabled="disabled"> 
     Button dropdown <span class="caret"></span> 
     </button> 
     <ul class="uib-dropdown-menu" role="menu" aria-labelledby="single-button"> 
       <li ng-repeat="choice in items track by $index"> 
      <a href>{{choice}}</a> 
     </li> 
     </ul> 
    </div> 


    <select> 
     <option ng-repeat="choice in items track by $index">{{choice}}</option> 
    </select> 

</div> 

example.js
$scope.items = [ 
    'The first choice!', 
    'The first choice!', 
    'And another choice for you.', 
    'but wait! A third!' 
    ]; 

http://plnkr.co/edit/tL7OVpU6Yep8ReiAa5FG?p=preview

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