我有一个名为MainVM
的变量,只要在基本布局视图中加载相应的.js
文件,然后在不同的视图中我需要设置其中一个,它就会被设置为一个新的挖掘视图模型实例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
来继续调用一个函数来检查是否每10ms定义MainVM
。但我想知道是否有人知道更好的方法,如何处理这个问题,例如我们可以使用promise
和then. But here it is not a function that I can take advantage of
promise`作为回调函数。它已经在共享基本布局中被调用了一次,并且无法将其放入函数中并在其他地方再次调用它。
答案 0 :(得分:2)
通过在回调函数中将$.Deferred()
传递给core.load(["Scripts/Shared/MainViewModel.js"])
,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)
})
});
function MainViewModel() {
this.id = 123;
this.CurrentVM = function() {
return this.id
};
}
var MainVM;
var deferred = $.Deferred();
var core = {
load: function(script, callback) {
callback(script)
}
}
core.load(["Scripts/Shared/MainViewModel.js"],
function() {
// asynchronous process
setTimeout(function() {
MainVM = new MainViewModel();
// resolve `MainVM`
deferred.resolve(MainVM);
}, 1 + Math.floor(Math.random() * 3500))
});
$(function() {
deferred.promise().then(function(mainview) {
// `view` : `MainVM`
core
.load(["Scripts/Account/AccountMainViewModel.js"], function() {
console.log(mainview.CurrentVM(), MainVM)
});
})
.fail(function(err) {
console.log("error loading MainVM", err)
})
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;