启动屏幕在调用服务器完成之前消失

时间:2014-01-26 14:47:41

标签: javascript durandal durandal-2.0 durandal-navigation

您好,我希望能够延迟我的应用程序,这就是我的意思。

这是我的shell视图:

<div>
<!-- ko compose: { view : header }-->
<!--/ko-->
<!-- ko compose: { view : content }-->
<!--/ko-->

这是我的shell viewmodel:

define(['plugins/router', 'services/dataService' , 'models/appViewModels'],
    function (router,dataService , appViewModels) {

        var vm = {
            header: ko.observable(),
            content: ko.observable(),
            activate: activate
        };

        function activate() {
            setActivePage();
        }


        function setActivePage() {
            $.when(dataService.account.isAuthenticated())
                .done(function(isAuthenticated) {
                    setDefaultDisplayPage(isAuthenticated)
                }).fail(function(data) {
                    alert(data);
                });
        }

        function setDefaultDisplayPage(isAuthenticated) {
            if (isAuthenticated) {
                setHeaderAndContentObservables(appViewModels.header.generalHeader, appViewModels.content.homeContent);
            } else {
                setHeaderAndContentObservables(appViewModels.header.loginHeader, appViewModels.content.loginContent);
            }
        }
}

我使用observable而不是我的视图的路径的字符串表示的共鸣是因为在我的shell中我决定是否应该在登录或主页上发送我的用户

这完全有效,除了从服务器获取isAuthenticated属性所花费的时间内,启动画面消失并且用户在空白页面上等待直到收到数据。

现在我可以尝试获取main.js文件中的数据并缓存它,但我认为main.js应该只有app配置责任。

在shell实际绑定并且启动画面消失之前,有没有办法在服务器上调用数据?

1 个答案:

答案 0 :(得分:2)

我同意PW Kad建议的内容。 Durandal充满了Q.js. 我有同样的情况 [检查用户是否经过身份验证=&gt;通过Durandal路由器从数据库加载用户菜单,该路由器返回promise =&gt;加载内容] 但是,我在代码中看不到路由器。

无论如何,在激活方法中你可以这样做:

  var vm = {
            header: ko.observable(),
            content: ko.observable(),
            isAuthenticated: ko.observable(false),
            activate: activate
        };

function activate() {

            return Authenticate()
                 .then(setDefaultDisplayPage)
                 .fail(failed);
        }
function Authenticate() {
// pass an observable as a parameter to your function 
                dataService.account.isAuthenticated(isAuthenticated);
                return Q.resolve();
                }
       function setDefaultDisplayPage() {        
        if(isAuthenticated()) {
    setHeaderAndContentObservables(appViewModels.header.generalHeader,appViewModels.content.homeContent);
}
        else { setHeaderAndContentObservables(appViewModels.header.loginHeader,appViewModels.content.loginContent);
        }
    }
    function failed(){
// failure code goes here
}

这样,在从服务器获取数据之前,您的viewmodel不会被绑定。