Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在确定对象已创建时获取对象的属性_Javascript_Jquery_Knockout.js - Fatal编程技术网

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。