在我的角度应用程序中,在下面的场景中,我遇到了一个问题。
有三个文件
mainCtrl.js
在应用程序加载时,将触发init()
mainCtl.js,它将像这样调用flowService
flowService.configureSteps();
这将调用flowService并进行服务器调用以获取数据。
flowService.js
function configureSteps() {
salesService.getSalesOrder().then(function(response) {
salesService.setSalesOrder(response);
});
}
这将把salesOrder
保存到subCntrl
中检索的服务中
subCtrl.js
在subCntrl的init中,我正在尝试获取我在服务中保存的salesOrder。
function init() {
salesService.getSalesOrder();
}
问题
当我像这样打网址时
http://www.myapp.com/review#/subpage
怎样才能使它同步。 ?
使用事件让subCtrl.js
知道已收到该值。现在,由于它仍然在$digest
循环下运行,因此您可以轻松处理subCtrl.js
的UI。在控制器和服务中注入$rootScope
。
flowService.js
function configureSteps() {
salesService.getSalesOrder().then(function(response) {
salesService.setSalesOrder(response);
$rootScope.$emit('order-recieved');
});
}
subCtrl.js
function init() {
$rootScope.$on('order-recieved',function(){
salesService.getSalesOrder();
})
}
您可以将mainCtrl.js flowService.configureSteps()
调用移动到:
使用UI-Router状态,您可以设置将在访问引用状态之前执行的解析函数,从而可以在实例化该状态的控制器之前执行同步操作。
在您的情况下,您可以在访问mainCtrl之前执行flowService.configureSteps()
并在访问subCtrl之前执行salesService.getSalesOrder()
(但肯定在之前的订单保存之后)。
使用ngRoute,您可以将路由更改回调定义为:
$rootScope.$on("$routeChangeStart", function (event, currentRoute, previousRoute) {
//
});
在此回调中,您可以在路由激活之前执行逻辑操作,确保在您点击页面时获得所需内容。
如果您需要进一步的帮助,请分享您的路线/州配置。
我已经实现了使用承诺。
flowService.js
function configureSteps() {
var salesPromise = salesService.getSalesOrder().then(function(response) {
salesService.setSalesOrder(response);
});
return salesPromise ;
}
salesService.setPromise(configureSteps()); // Saves the promise to a service
subCtrl.js
function init() {
salesService.getPromise().then(function() {
salesService.getSalesOrder(); // This will be called only on resolve of the promise.
});
}
在服务中写下setPromise
和getPromise
。