1

当我的 SPA 初始化时,它必须进行一些需要在加载任何视图之前运行的 ajax 调用。我已将这些放在 shell.js 的激活函数中。在其他视图中,我从激活函数返回这些调用并且一切正常。但在外壳中,我应该从 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'
       });
   },
4

2 回答 2

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');

        }
},

function并且always需要进行相应的调整。

于 2013-07-12T20:37:37.357 回答
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;

    },
于 2013-07-12T20:33:37.940 回答