我做了一个设计,其中uaContext
有一些有用的信息,例如productId
和operatorId
。
我需要这些信息来显示每个页面的内容。
myApp.service('uaContext', function($cookieStore){
this.init = function() {
this.isLogged = new Field();
this.userName = new CookieField('userName', $cookieStore);
this.appName = new Field();
this.subAppName = new Field();
this.operator = new Field();
this.operatorList = new FilterField();
this.product = new Field();
this.productList = new FilterField();
};
this.init();
});
为了确保我掌握了这些信息,我抓住了全球$routeChangeStart
事件:
myApp.run( function($rootScope, $routeParams, uaViewProvider, uaAuthService, uaContext){
$rootScope.$on('$routeChangeStart', function (event, next) {
if (uaContext.isLogged.get() == false && next.loginRequired != false){
console.log('View requires to be logged in');
if (uaAuthService.sessionCookieExists() == true){
console.log('Recover session from Cookie');
uaAuthService.loadSession().then(function() {
uaContext.operator.set(uaContext.operatorList.filter('id', +$routeParams.operatorId));
uaContext.productList.set(uaContext.operator.get().products);
uaContext.product.set(uaContext.productList.filter('id', +$routeParams.productId));
});
} else{
console.log('User not logged in. Redirect to login.');
uaViewProvider.redirectToView('login');
}
}
});
});
在这种情况下,当我通过cookie恢复会话时,我请求使用loadSession
承诺重新加载会话。然后,我根据网址参数定义productId
和operatorId
。
问题是在视图中我需要在请求更多信息之前获取这些参数:
var myApp2 = angular.module('ua.myApp2', []);
myApp2.controller('ua.myApp2Controller',
function ($scope, $rootScope, $routeParams, uaContext, uaApiInterface) {
$scope.$on('$routeChangeSuccess', function () {
uaContext.appName.set('Settings');
uaContext.subAppName.set('Sims');
});
console.log('On route change');
$scope.$watch(function(){
watchValue = uaContext.operator.get().id + '-' + uaContext.product.get().id
return watchValue;
}, function(){
uaApiInterface.getSimList(uaContext.operator.get().id,uaContext.product.get().id).then(
function(objects) {
console.log('Then');
$scope.simList = objects.data.objects;
console.log($scope.simList);
console.log(objects.data.objects);
}
)
},true);
}
);
我发现等待loadSession
承诺结束的唯一解决方案是监视operatorId
和productId
。
问题是我必须为我的所有观点定义此观察。这真的不干,所以我的问题是如何优化这个?
答案 0 :(得分:0)
我找到的最佳解决方案是使用此代码:
uaAuthService.loadSession().then(function() {
uaContext.operator.set(uaContext.operatorList.filter('id', +$routeParams.operatorId));
uaContext.productList.set(uaContext.operator.get().products);
uaContext.product.set(uaContext.productList.filter('id', +$routeParams.productId));
})
在上下文服务中。
然后在每个视图中,入口点为:
uaContext.getSession().then(...
如果您有任何意见或建议。