Компиляция классов во время выполнения с помощью приложения весенней загрузки

Если обратный вызов действительно из стороннего источника вне контекста выполнения AngularJS, можно просто использовать $apply:

portal.controller('portalViewController', function($scope) {
    storage.get('portal_url', (err, data) => {
        $scope.$apply(function() {
            $scope.url = data.url;
        });
    });
});

Из Документов:

AngularJS изменяет нормальный поток JavaScript, предоставляя свой собственный цикл обработки событий. Это разбивает JavaScript на классический контекст исполнения и AngularJS. Только операции, которые применяются в контексте выполнения AngularJS, получат выгоду от привязки данных AngularJS, обработки исключений, просмотра свойств и т. Д. Вы также можете использовать $apply() для ввода контекста выполнения AngularJS из JavaScript.

Имейте в виду, что в большинстве мест (контроллеры, службы) $apply уже вызывается для вас директивой, которая обрабатывает событие. Явный вызов $apply необходим только при реализации пользовательских обратных вызовов событий или при работе со сторонними обратными вызовами библиотеки.

[/g3]

- Руководство для разработчиков AngularJS - Интеграция с циклом событий браузера


Преобразование API на основе обратного вызова в API-интерфейс на основе AngularJS

Можно интегрировать API-интерфейс обратного вызова в структуру AngularJS, создав службу:

app.service("storageAPI", function($q) {
    this.get = function(url) {
        var deferred = $q.defer();
        storage.get(url, (err, data) => {
            if (err) { 
                deferred.reject(err);
            } else {
                deferred.resolve(data);
            };
        });
        return deferred.promise;
    };
});

Использование:

app.controller('portalViewController', function($scope, storageAPI) {
    storageAPI.get('portal_url')
      .then(function(data) {
         $scope.url = data.url;
    }).catch(function(err) {
         console.log(err);
    });
});

Преимущество этого подхода заключается в том, что он интегрирует API в AngularJS без необходимости $apply (услуга $ q делает это автоматически). Кроме того, он эффективно обрабатывает ошибки API.

Дополнительные сведения см. В разделе - AngularJS $ q Service API Reference - API отложенного доступа .

3
задан Jorge Lavín 19 January 2019 в 09:44
поделиться