Angularjs在设置变量时承诺并设计问题

时间:2013-10-09 20:45:13

标签: angularjs promise

我做了一个设计,其中uaContext有一些有用的信息,例如productIdoperatorId。 我需要这些信息来显示每个页面的内容。

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承诺重新加载会话。然后,我根据网址参数定义productIdoperatorId

问题是在视图中我需要在请求更多信息之前获取这些参数:

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承诺结束的唯一解决方案是监视operatorIdproductId

问题是我必须为我的所有观点定义此观察。这真的不干,所以我的问题是如何优化这个?

1 个答案:

答案 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(...

如果您有任何意见或建议。