Durandal:如何在shell激活函数中正确地发出ajax请求

时间:2013-07-12 20:15:30

标签: jquery durandal

当我的SPA初始化时,它必须进行一些需要在加载任何视图之前运行的ajax调用。我把它们放在shell.js的activate函数中。在其他视图中,我从activate函数返回这些调用,一切正常。但是在shell中我应该从router.activate调用返回。如何返回正确的视图并确保进行那些ajax调用?我看到的是数据并不总是加载。

 activate: function () {

            var query =
           $.when(
                    datacontext.getCurrentUser(),
                    datacontext.getGroupsAuthorized(),
                    datacontext.getTeams(),
                    datacontext.getRoles(),
                    datacontext.checkPermissions('views.shell')
                    )
            .then(function (s0, s1, s2,s3, s4) {    
                /* code excluded */        
            },
            function (f0, f1, f2) {
               /* code excluded */

            }).always( function() {
                /* code excluded */                   
            });

            return router.activate('welcome');

    },

所有的datacontext调用都是这样的:

getCurrentUser = function () {          
       return $.ajax({
           url: 'api/currentuser/',
           type: 'GET'
       });
   },

2 个答案:

答案 0 :(得分:3)

确保返回一个承诺,以便Durandal知道何时允许继续撰写。 沿线的东西应该可以解决问题。

activate: function () {

   return  $.when(
                datacontext.getCurrentUser(),
                datacontext.getGroupsAuthorized(),
                datacontext.getTeams(),
                datacontext.getRoles(),
                datacontext.checkPermissions('views.shell')
                )
        .then(function (s0, s1, s2,s3, s4) {    
            /* code excluded */        
            return router.activate('welcome');

        }
},

functionalways需要相应调整。

答案 1 :(得分:0)

仅将router.activate('welcome')片段作为when子句中的另一个承诺就足够了吗?

activate: function () {    

       var query =
           $.when(
                    datacontext.getCurrentUser(),
                    datacontext.getGroupsAuthorized(),
                    datacontext.getTeams(),
                    datacontext.getRoles(),
                    datacontext.checkPermissions('views.shell'),
                    router.activate('welcome');
                    )
            .then(function (s0, s1, s2,s3, s4, s5) {    
                /* code excluded */        
            },
            function (f0, f1, f2) {
               /* code excluded */

            }).always( function() {
                /* code excluded */                   
            });

            return query;

    },