Как вы обрабатываете асинхронные данные в директивах для 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: '=' выше?

Я начал задаваться вопросом, должен ли я просто получать данные через службы, но, похоже, возникнут точно такие же проблемы. У меня также была мысль получить данные непосредственно в директиве, но я не хочу, чтобы директива отвечала за получение данных. Я только хочу, чтобы директива отвечала за отображение данных и обновление представления, когда пользователь взаимодействует с ним.

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

Ответы на вопрос(3)

Ваш ответ на вопрос