0

我有一个 HTML 元素绑定到我的视图模型中的一个可观察对象,它是使用John Resig 的简单 javascript 继承构建的。

<div data-bind="with: selectedItem()">
    ...
    <div  data-bind="click: $root.save">Save changes</div>
    ...
</div>

我的 ViewModel 看起来像这样。

var ViewModel = Class.extend({
    init: function(type){
        this.type = type;
        this.selectedItem = ko.observable({name: "My name"});
    },
    save: function(data){
        alert(this.type);
    }
});

ViewModel#save 中的“this”引用了“selectedItem()”。换句话说,“this”引用了传递给函数的“data”。我怎样才能访问 ViewModel 的实例呢?

已编辑

这里的目的是从 ViewModel 继承函数。我想分别将“this.type”作为“第一”和“第二”访问。

var FirstViewModel = ViewModel.extend({
    init : function() {
    this._super('first');
    }
});

var SecondViewModel = ViewModel.extend({
    init : function() {
    this._super('second');
    }
});
4

1 回答 1

0

查看此答案及其下方的答案: https ://stackoverflow.com/a/346044/1388165

您遇到了 Javascript 的一个有趣部分,其中“this”指的是调用函数的对象,而不是被调用函数的父对象。这可以通过使用闭包来处理,例如下面示例中的 common that = this 模式。

如果你打算花很多时间在 Javascript 上,我强烈推荐 Douglas Crockford 的书“Javascript: The Good Parts”,它会让你意识到很多这样的事情。我还建议在 YouTube 上观看 Crockford 的演讲(有很多)。

编辑示例:

var ViewModel = Class.extend({
    that: {},
    init: function(){
        that = this;
        selectedItem = ko.observable({name: "My name"});
    },
    save: function(data){
        alert(that);
    }
});

var o = new ViewModel();
o.save();
于 2012-05-18T21:00:56.820 回答