Нг-повтор против нг-опций, который лучше для меня
Мне нужно отобразить данные 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, потому что это предназначено для использования в подобных случаях.
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>