Как получить доступ к решенной дате в корневой масштабе
-
21-12-2019 - |
Вопрос
В моем приложении у меня есть состояния, которые извлекают различные ресурсы с сервера, используя предложение resolve
.
У меня также есть Global контроллер, который нуждается в доступе к этим ресурсам.Например, рассмотрим панирум, который необходимо показать некоторые данные этих ресурсов.
Как я могу получить доступ к этим ресурсам от глобального контроллера?Даже если у меня есть государственный объект под рукой, я не мог понять, как извлечь разрешенные свойства.
Редактировать: Я использую УМ-маршрутизатор Пакет для маршрутизации. .
Решение 2
Идея состоит в том, чтобы добавить решающий ключ, который зависит от необходимых данных (см. Генеракодицетагкод в коде ниже).Когда функция этого ключа вызывается, мы можем быть уверены, что наши данные RegacodicCode готов к использованию.Затем мы поместим его в состояние (свойство breadcrumb
).
.state('some.item.detail.state', {
url: '/:itemId',
resolve: {
item: function($stateParams, MyServerResource) {
return MyServerResource.get({itemId: $stateParams.itemId}).$promise;
},
breadcrumb: function(item) {
this.data = item;
}
},
templateUrl: 'myTemplate.html'
}
.
Чтобы потреблять данные в глобальном контроллере, мы простым изучаем item
.
Другие советы
Как я понимаю, у вас есть что-то подобное:
.when('/', {
controller: 'HomeCtrl',
templateUrl: 'home.html',
resolve: {data: someDataFetcher}
})
.
И вам нужно получить доступ к данным в глобальном контроллере.Я должен был бы увидеть код кода, чтобы прекрасно понять, что вы хотите, но я бы предложил использовать общий сервис.
function HomeCtrl (data, myDataService) {
myDataService.data = data;
}
function GlobalCtrl (myDataService) {
myDataService.data // => The data
}
.
Услуга имеет только один экземпляр, поэтому легко использовать это, чтобы обмениваться состоянием и ресурсами в контроллерах.
Надеюсь, это поможет.
<Сильное> Обновление :
Создать измеренное закрытие:
var myResolveClosure = function (resolver) {
// Return a wrapper around the resolver
return function (globalController, $q) {
var deferred = $q.defer();
resolver($q).then(function (data) {
globalController.addData(data);
deferred.resolve(data);
}).catch(function () {
deferred.reject();
});
return deferred.promise;
}
}
.when('/', {
controller: 'HomeCtrl',
templateUrl: 'home.html',
resolve: {
data: myResolveClosure(function ($q) {
var deferred = $q.defer();
// do something and resolve with the data
return deferred.promise;
})
}
})
.
Так что в основном вы проходите в конкретном Resolver, вам нужно получить эти данные.«MyReSolveCluity» будет обернуть функцию вокруг Resolver, проходя через $ q к конкретному Resolver, чтобы сделать некоторую выборку.Затем он возьмет данные, разрешенные от конкретного Resolver и передают его в глобальный контроллер, затем разрешают себя так, чтобы любой указанный вами контроллер также получит данные.
Надеюсь, это имеет смысл: -)