如何在根范围内访问已解析的日期
-
21-12-2019 - |
题
在我的应用程序中,我有状态,使用以下方法从服务器获取各种资源 resolve
条款。
我也有一个 全球 需要访问这些资源的控制器。例如,考虑一个面包屑,它需要显示这些资源的一些数据。
如何从全局控制器访问这些资源?即使我手头有状态对象,我也无法弄清楚如何提取解析的属性。
编辑:我正在使用 ui-路由器 包进行路由。
解决方案 2
这个想法是添加一个取决于所需数据的resolve键(请参阅 breadcrumb
在下面的代码中)。当调用此密钥的功能时,我们可以放心,我们的数据 item
准备使用。然后我们把它放在状态(data
财产)。
.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'
}
要使用全局控制器中的数据,我们简单检查 $state.current.data
.
其他提示
据我了解,你有这样的事情:
.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;
})
}
})
所以基本上你传递了你需要获取数据的特定解析器。"MyResolveClosure"将在解析器周围包装一个a函数,将$q传递给特定的解析器以进行一些提取。然后,它将获取从特定解析器解析的数据并将其传递到全局控制器,然后解析自己,以便您指定的任何控制器也将获取数据。
希望这是有道理的:-)
不隶属于 StackOverflow