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

时间:2015-04-30 02:02:41

标签: knockout.js durandal

我试图通过点击功能访问一个observable,但无法找出正确的上下文。

await _service.InvokeApiAsync<LoginRequest, HttpResponseMessage>("EasyParkLogin", loginRequest);

this.contacts是未定义的,就像$ root,$ parent等的任意组合一样。如何获得使用observable的正确上下文? (删除(联系人)与视图中的单击:绑定。)

2 个答案:

答案 0 :(得分:2)

试试这个:

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();
  };
});

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

警告未测试代码,因此可能存在错误

答案 1 :(得分:2)

路易斯的回答没有任何问题,但我的做法不同,看到其他选择也不会让你受伤。

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;

});

我喜欢这种方式,因为它更容易看到发生了什么,但它只适用于单身场景。