1

我正在尝试将工作中的 Durandal 视图模型模块从单例转换为实例。原始工作版本遵循以下模式:

define(['knockout'],
function(ko) {

    var vm = {
        activate: activate,
        companyId: null;
        company: ko.observable({})
    };

    return vm;

    function activate(companyId) {
        vm.companyId = companyId;
        //get company data then
        vm.company(data);
    }
}

新版本导出一个函数,以便我在每个请求上都获得一个新实例......

define(['knockout'],
function(ko) {

    var vm = function() {
        activate = activate;
        companyId = null;
        company = ko.observable({});
    };

    return vm;

    function activate(companyId) {
        vm.companyId = companyId;
        //get company data then
        vm.company(data);
    }
}

我得到的错误是“object function () [...function signature...] has no method company on line vm.company(data);。我做错了什么?为什么我可以设置属性但无法访问可观察到的淘汰赛? 我应该如何重构原始代码,以便在每个请求上都获得一个新实例?


我为简化这个问题的代码所做的努力掩盖了实际问题。我真正的代码是使用 Q Promise 并使用 Q.All 调用两个方法。由于 Q 位于全局命名空间中,因此在转换为函数后无法解析我的视图模型。将视图模型传递给 Q 调用的方法解决了这个问题。

4

3 回答 3

1

您应该以这种方式重新考虑它:

define(['knockout'],
  function(ko) {

    var vm = function() {
      this.companyId = null;
      this.company = ko.observable({});
    };

    vm.prototype.activate = function (companyId) {
      this.companyId = companyId;
      //get company data then
      this.company(data);
    };

    return vm;
  }
于 2013-10-28T18:33:52.333 回答
1

尝试这个

define(['knockout'],
function(ko) {
var createVM = function() {
    var vm = {
    activate: activate,
    companyId: null;
    company: ko.observable({})
    }
    return vm;
};

. var vm = createVM(); 返回虚拟机;

function activate(companyId) {
    vm.companyId = companyId;
    //get company data then
    vm.company(data);
}
}
于 2013-10-28T23:36:09.150 回答
1

试试这种方式:

var vm = function() {
        this.activate = activate;
        this.companyId = null;
        this.company = ko.observable({});
    };

如果没有任何限定符,这些关键字将被分配给全局变量。

但是,如果这个模块已经被你不能轻易修改的代码使用,那么你可能会遇到问题,因为任何引用 vm 的东西都需要知道它是他们需要调用的函数。

于 2013-10-28T17:31:06.193 回答