Как вы обрабатываете асинхронные данные в директивах для AngularJS
Это похоже на вопросэтот, Я все еще вижу некоторые проблемы с асинхронными данными в моих директивах. В основном у меня есть директивы, в которые я хочу передать данные, и эти данные выбираются асинхронно. Я начал делать это с помощью свойства scope в директиве:
scope: {
myAsyncData: '='
}
В функцию ссылки я добавил$watch
так что я мог бы обновить свою модель на основе значения в области. Что-то вроде этого:
scope.$watch(scope.foo, function() {
//logic based on myAsyncData
}
Когда я сделал это, я начал получать ошибки JavaScript, потому что асинхронные данные еще не вернулись. Именно это побудило меня опубликовать вопрос, указанный выше. Итак, я изменил$watch
что-то вроде этого:
scope.$watch(scope.foo, function() {
if (angular.isDefined(scope.myAsyncData))
{
//logic based on myAsyncData
}
}
Когда я делаю это, я не получаю ошибки JavaScript. Тем не менее$watch
не запускается снова, когда возвращаются данные, и поэтому мое представление не отражает модель правильно. Я пытался назначить$scope.foo
в$timeout
запустить наблюдение после того, как данные возвращены, но это кажется слишком зависимым от времени и не очень надежным.
У меня вопрос, каков правильный способ взаимодействия с асинхронными данными в директиве? Я видел несколько примеров, которые получают данные в директиве, например так:
scope.$eval(attrs.myAsyncData);
Это, похоже, ничего не меняет. Есть ли что-то принципиально иное, чемmyAsyncData: '='
выше?
Я начал задаваться вопросом, должен ли я просто получать данные через службы, но, похоже, возникнут точно такие же проблемы. У меня также была мысль получить данные непосредственно в директиве, но я не хочу, чтобы директива отвечала за получение данных. Я только хочу, чтобы директива отвечала за отображение данных и обновление представления, когда пользователь взаимодействует с ним.
Возможно, я упускаю что-то очевидное в том, как это должно быть сделано, поэтому любой вклад мне очень понравился бы.