Javascript 如何在确定对象已创建时获取对象的属性
我有一个名为Javascript 如何在确定对象已创建时获取对象的属性,javascript,jquery,knockout.js,Javascript,Jquery,Knockout.js,我有一个名为MainVM的变量,每当在基本布局视图中加载相应的.js文件时,它就会被设置为knockout视图模型的一个新实例,然后在不同的视图中,我需要设置MainVM的一个属性 var MainVM; core.load(["Scripts/Shared/MainViewModel.js"], function () { MainVM = new MainViewModel(); }); 问题:我需要确保MainVM设置了MainViewModel的新实例,然后为其设置属性。
MainVM
的变量,每当在基本布局视图中加载相应的.js
文件时,它就会被设置为knockout视图模型的一个新实例,然后在不同的视图中,我需要设置MainVM的一个属性
var MainVM;
core.load(["Scripts/Shared/MainViewModel.js"],
function () {
MainVM = new MainViewModel();
});
问题:我需要确保MainVM
设置了MainViewModel
的新实例,然后为其设置属性。
我所做的是将它包装在一个setTimeout
中,200毫秒后我调用MainVM
,希望它已设置为如下所示:
$(function() {
setTimeout(function() {
core.load(["Scripts/Account/AccountMainViewModel.js"],
function () {
MainVM.CurrentVM(new AccountMainViewModel());
MainVM.CurrentVM().Load();
});
}, 200);
});
但如果出于任何原因,加载
MainVM
所需时间远远超过200毫秒,则上述方法似乎并不准确。此外,我还考虑使用setInterval
来继续调用一个函数,该函数检查MainVM
是否每10毫秒定义一次。但我想知道是否有人知道更好的方法,如何处理这个问题,比如我们可以使用promise
和作为回调函数。但在这里,它不是我可以利用的功能。它已经在共享基本布局中被调用过一次,无法将其放入函数中并在其他地方重新调用。您可以在core.load([“Scripts/shared/MainViewModel.js]”)时使用$.Deferred()
执行任务。
调用通过将MainVM
传递给Deferred.resolve()
在回调函数中。在.ready()
处理程序中,使用.then()
访问已解析的承诺值:MainVM
var MainVM; var deferred = $.Deferred();
core.load(["Scripts/Shared/MainViewModel.js"],
function () {
MainVM = new MainViewModel();
deferred.resolve(MainView);
});
$(function() {
deferred.promise().then(function(mainview) {
// `view` : `MainVM`
core.load(["Scripts/Account/AccountMainViewModel.js"],
function () {
mainview.CurrentVM(new AccountMainViewModel());
mainview.CurrentVM().Load();
});
})
// handle error
.fail(function(err) {
console.log("error loading MainVM", err)
})
});
函数MainViewModel(){
这个id=123;
this.CurrentVM=函数(){
把这个还给我
};
}
var-MainVM;
var deferred=$.deferred();
var核心={
加载:函数(脚本、回调){
回调(脚本)
}
}
load([“Scripts/Shared/MainViewModel.js”],
函数(){
//异步进程
setTimeout(函数(){
MainVM=新的MainViewModel();
//解析“MainVM”`
延迟。解决(MainVM);
},1+数学地板(数学随机()*3500))
});
$(函数(){
deferred.promise().then(函数(mainview){
//`view`:`MainVM`
核心
.load([“Scripts/Account/AccountMainViewModel.js”],函数(){
console.log(mainview.CurrentVM(),MainVM)
});
})
.失败(功能(错误){
log(“加载MainVM时出错”,err)
})
});代码>
回答得很好。只是想让你知道你是否想为别人编辑你的帖子dfd.resolve(MainView)
需要延迟。resolve(MainView)
和view.CurrentVM
需要更新MainView.CurrentVM
@Mark.Ben。