У меня есть директива select2 для множественного выбора стран с пользовательским запросом для получения данных:
// Directive
<input ng-model="filters.countries" ui-select2="filters.countryOptions"
data-placeholder="Choose a country...">
// filters.countryOptions
{
multiple: true,
query: function() {
get_list_of_countries();
}
}
// Formatted data from remote source
[
{id: 'US', text: 'United States'},
{id: 'CA', text: 'Canada'} ...
]
Я пытаюсь установить первоначально выбранные значения в моем контроллере, используя:
$scope.filters.countries = [{id: 'US', text: 'United States'}];
Это правильно устанавливает модель, однако это происходит до того, как произошла инициализация select2. Когда я прохожу оставшийся код инициализации, ввод временно отображает [Object]
, прежде чем окончательно скрыть $scope.filters.countries
и ввод, но он не отображает текст-заполнитель во вводе.
Чтобы обойти это, я использую следующее для сброса начального значения моделей:
$scope.$on('$viewContentLoaded', function() {
setTimeout(function() {
$scope.filters.countries = [{id: 'US', text: 'United States'}];
}, 100);
});
Кажется действительно хакерским использовать setTimeout
. Есть ли лучший способ, который мне не хватает?
Обновление 1
По просьбе ProLoser вот демо и билет на github.
Демонстрация: http://plnkr.co/edit/DgpGyegQxVm7zH1dZIJZ?p=preview
Проблема GitHub: https://github.com/angular-ui/angular-ui/issues/455 а>
Следуя совету ProLoser, я начал использовать функцию initSelection select2:
initSelection : function (element, callback) {
callback($(element).data('$ngModelController').$modelValue);
},
Это помогает, но все еще кажется обходным путем.
initSelection
в select2 (это именно то, для чего он предназначен), вы могли бы просто сделать$scope.filters.countries = 'US'
, но весь код инициализации требует более тщательного тестирования, поэтому мы должны быть уверены, что то, что вы сделали, также поддерживается. Проблема может заключаться в том, что не найдена совпадающая ссылка на выбранный объект. - person ProLoser   schedule 20.02.2013