Нг-повтор против нг-опций, который лучше для меня

Мне нужно отобразить данные JSON в выпадающем списке, для этого у меня есть два варианта, один из которых - с помощью ng-repeat, а другой - ng-options.

Код повторения ng:

в HTML-файл:

<select>
<option ng-repeat="prod in testAccounts" value="{{prod.id}}">{{prod.name}}</option>
</select>

и в файле сценария:

$http.get('document.json').success(function (data) 
{
    $scope.testAccounts = angular.fromJson(data);
 }

и другие нг-опции:

в HTML-файл:

<select ng-model="selectedTestAccount" ng-options="c as c.name for c in testAccounts1"></select>

в файле скрипта:

$http.get('document.json').success(function (data) 
{
    $scope.testAccounts1 = data;
    $scope.selectedTestAccount = $scope.testAccounts1[0];
}

Теперь я хочу знать, какой из них лучше всего подходит для моего проекта, чтобы улучшить производительность. Любые рекомендации, пожалуйста.

3 ответа

Решение

Я думаю, что ng-options, потому что это предназначено для использования в подобных случаях.

Документы Angularjs: -

ngOptions предоставляет средство итератора для элемента, который следует использовать вместо ngRepeat, если вы хотите, чтобы выбранная модель была привязана к нестроковому значению. Это связано с тем, что элемент option в настоящее время может быть привязан только к строковым значениям.

Что касается производительности, я думаю, что вы должны использовать свою собственную директиву, которая будет обрабатывать ее.

ng-options помещает каждый элемент в $watch => очень медленно, если список содержит сотни элементов

ng-repeat будет медленно отображаться.

Затем вы должны предпочесть использовать свою собственную директиву и встроить в нее свой HTML

Приведенный ниже код (также в Plunker) не показывает никакой разницы, даже если модель связана со нестроковым значением (арифметическим кодом), за исключением инициализации, где подход с ng-repeat не может отобразить значение по умолчанию (или, возможно, для этого есть обходной путь). После выбора значения поведение остается таким же:

<html>
  <head>
    <title>making choices </title>
    <script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.min.js'></script>
  </head>
  <body ng-app='theApp' ng-controller='TheController as ctl'>
    <div ng-controller='TheController as ctl'>
      Select your favorite fruit:
      <select ng-model='ctl.selectedFruitCode'>
        <option ng-repeat='fruit in ctl.fruits' ng-value='fruit.code'>{{fruit.label}}</option>
      </select>
      <br/>
      Selected fruit is: <tt>{{ctl.getSelectedFruit().label}}</tt> (from code: {{ctl.selectedFruitCode}})
    </div>
    <hr>
    <div ng-controller='TheController as ctl'>
      Select your favorite fruit:
      <select ng-model='ctl.selectedFruitCode'
              ng-options='c.code as c.label for c in ctl.fruits'>
      </select>
      <br/>
      Selected fruit is: <tt>{{ctl.getSelectedFruit().label}}</tt> (from code: {{ctl.selectedFruitCode}})
    </div>
    <script type='text/javascript'>
     angular.module('theApp', [])
            .controller('TheController', [function() {
              var self = this;
              self.fruits = {};
              self.fruits = [{label: 'Apples'   , code:0},
                             {label: 'Bananas'  , code:1},
                             {label: 'Peach'    , code:2},
                             {label: 'Apricot'  , code:3}];
              self.selectedFruitCode = self.fruits[0].code;
              self.getSelectedFruit = function() {
                for (var i = 0 ; i < self.fruits.length ; i++) {
                  if (self.fruits[i].code==self.selectedFruitCode)
                    return self.fruits[i];
                }
              };
            }]);
    </script>
  </body>
</html>
Другие вопросы по тегам