最近我一直在开发一个网络应用程序,<select>
一年中的每一天我都需要一个元素。
所以我做了这样的事情,其中daysOfYear
是一年中所有日子的availableValues
数组,并且是所有可能值的数组。
<div ng-repeat="day in daysOfYear">
<select ng-model="day.value" ng-options="value for value in availableValues"></select>
</div>
问题是它非常慢,在 Firefox中加载大约需要 5 秒,在此期间浏览器完全冻结。请注意,计算时已经有 2 秒的冻结daysOfYear
。没有选择我有 2 秒的冻结,有选择我有 7 秒的冻结,所以我确定这是由 selects 引起的。每当我更改其中一个选择的值时,还会有一个额外的小冻结。
所以我决定遵循我在新闻组上看到的建议,编写自己的模块来填充<select>
. 我的模块(请参阅下面的代码)将任何<select>
带有指令的app-typeslist
指令添加到数组中。然后options
从服务器加载列表,列表中的所有元素都用给定的选项填充。
问题是 AngularJS 没有在选项列表中检测到这个修改。<select>
没有属性,并且包含一个表示“无效值”状态
的value
附加元素。有没有办法告诉 AngularJS 我希望它更新这个选择?<option>
谢谢。
这是模块的源代码。我认为根本没有必要回答这个问题,但我想你无论如何都会要求它:
(function() {
var elementsList = $();
var html = null;
angular
.module('elementsTypes', [])
.config(function($compileProvider) {
$compileProvider.directive('appTypeslist', function() {
var directiveDefinitionObject = {
link: function(scope, element, attrs) {
elementsList.push($(element));
if (html)
$(html).each(function() { $(this).clone().appendTo(element); });
}
};
return directiveDefinitionObject;
});
})
.run(function($http, $rootScope) {
$http.get(url of the types).success(function(data) {
html = $();
angular.forEach(data, function(category) {
var gr = $('<optgroup/>').attr('label', category.description);
angular.forEach(category.elements, function(elem) {
$('<option/>').attr('value', elem.name).text(elem.description).appendTo(gr);
});
html.push(gr);
});
elementsList.each(function() {
var e = this;
$(html).each(function() { $(this).clone().appendTo(e); });
});
});
});
})();