2016-03-03 1 views
0

Наверное, это так же просто, как я думаю, но я не могу найти ответ на свой вопрос в Интернете, поэтому, надеюсь, вы, ребята, знаете ответ, просто взглянув на небольшой фрагмент моего кода.Устранение должно содержать все обещания даже от контроллера?

Проблема: Я использую маршрутизатор пользовательского интерфейса в Угловом, и он загружает шаблон, прежде чем все данные будут загружены. Таким образом, все поля ввода получают правильные значения ПОСЛЕ того, как шаблон уже загружен. Таким образом, поля ввода пустые для второй или два ....

Я думаю, что моя решимость не так, как должно быть:

Так что мой UI-маршрутизатор код выглядит примерно так (проверить объект разрешаемого) :

$stateProvider.state('teststate', { 
    url: '/test/', 
    templateUrl: 'app/page/template.html', 
    controller: 'testCtrl', 
    resolve: { 
     access: ["Access", function(Access) { return Access.isAuthenticated(); }], 
     UserProfile: 'UserProfile' 
    } 
}); 

Теперь контроллер содержит обещание, чтобы получить некоторые данные из API URL:

function TestCtrl($scope, $state, $stateParams, TestService) { 

    TestService.get($stateParams.id).then(function(response) { 
     $scope.data = response; 
    }); 
} 

Теперь сервис (который подключается к API) должен вернуть обещание в Contro Меллер:

TestService.factory('TestService', ['Restangular', function(Restangular) { 

    var factory = {}; 

    factory.get = function(id) { 
     return Restangular.one('api/test', id).get(); 
    } 

    return factory; 

}]); 

Теперь, может быть проблемой, что из-за TestService.get() (который подключается к API) в контроллере, запускается на выполнении НЕ перед загрузкой шаблона, потому что это не внутри resolve объекта? Итак, маршрутизатор пользовательского интерфейса не разрешает вызов API? Мне просто интересно, или я должен переместить все методы, которые вызывают вызовы API, для объекта разрешения каждого стата внутри $stateProvider.

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

ответ

0

Ваши предположения верны.

Если разрешить TestService.get в маршрутизации конфиг данные были бы легко доступны для контроллера в качестве инъекционного ресурса

+0

Спасибо! Полезно знать :) –

0

Если вы не хотите, чтобы ваш контроллер для запуска и ваш шаблон, чтобы показать, прежде чем все ваши API вызовы будут завершены , вы должны поместить все их в ui-routers resolve.

Однако, если запросы API могут занять некоторое время, то лучше сразу перейти на новую страницу и показать какой-либо индикатор загрузки (например, block-ui), пока запущен ваш вызов API.

+0

Другой еще более простой модуль [угловой занят] (https://github.com/cgross/angular-busy). просто укажите его на обещание – charlietfl

+0

block-ui, вы также можете просто включить его для всех асинхронных запросов. Я думаю, что самая большая разница между двумя библиотеками заключается в том, что угловой занят обычно привязан к определенной части страницы, а block-ui блокирует всю страницу. –

+0

Может использовать его также в глобальном масштабе – charlietfl

Смежные вопросы