在 durandal viewmodel 的点击绑定函数中获取 viewmodel 上下文

Get viewmodel context in click binding function in durandal viewmodel

我正在尝试通过点击函数访问可观察对象,但无法找到正确的上下文。

define(['plugins/http', 'durandal/app', 'knockout', 'session'], function (http, app, ko, session) {
  return {
    contacts: ko.observableArray([]),
        activate: function () {

            var that = this;
            headers = {contentType: "application/json", token: session.token}
            return http.get('/api/contacts', {}, headers).then(function(response) {
                that.contacts(response);
            });
    },
    Delete: function(contact) {
            console.log(this.contacts);
            //this.contacts.remove(contact);
    },
  };
});

this.contacts 未定义,$root、$parent 等的任意组合也是如此。如何获得正确的上下文以使用可观察对象? (视图中的删除(联系人)绑定了点击:)

试试这个:

define(['plugins/http', 'durandal/app', 'knockout', 'session'], 
    function (http, app, ko, session) {

    function myVm(){
        var self=this;
        self.contacts =  ko.observableArray([]);
        self.activate =  function () {

            var that = this;
            headers = {contentType: "application/json", token: session.token}
            return http.get('/api/contacts', {}, headers).then(function(response) {
            that.contacts(response);
            });
        }
        self.Delete = function(contact){
            console.log(self.contacts());
        }
    }

    return new myVm();
  };
});

我们在这里所做的是在函数范围内创建一个自变量,这将允许您在闭包中引用实际对象,而 this 不再引用该对象。

警告没有测试代码所以可能有错误

Luis 的回答没有任何问题,但我的做法不同,看到其他选项也不会对您造成伤害。

define(['plugins/http', 'durandal/app', 'knockout', 'session'], 
    function (http, app, ko, session) {

  var vm = {
    contacts:  ko.observableArray([])
  };

  vm.activate = function () {
    headers = { contentType: "application/json", token: session.token }
    return http.get('/api/contacts', { }, headers)
      .then(function(response) { vm.contacts(response); });
  };

  vm.Delete = function(contact) {
    console.log(vm.contacts());
  };

  return vm;

});

我更喜欢这种方式,因为它更容易看到正在发生的事情,但它只适用于单例场景。