每当我们确定已创建对象时,如何获取对象的属性

时间:2016-10-15 00:05:45

标签: javascript jquery knockout.js

我有一个名为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。但我想知道是否有人知道更好的方法,如何处理这个问题,例如我们可以使用promisethen. But here it is not a function that I can take advantage of promise`作为回调函数。它已经在共享基本布局中被调用了一次,并且无法将其放入函数中并在其他地方再次调用它。

1 个答案:

答案 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;
&#13;
&#13;