您好,我希望能够延迟我的应用程序,这就是我的意思。
这是我的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实际绑定并且启动画面消失之前,有没有办法在服务器上调用数据?
答案 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不会被绑定。