【问题标题】:Knockout data-bind scope variable "this"敲除数据绑定范围变量“this”
【发布时间】:2012-05-18 20:47:42
【问题描述】:

我有一个 HTML 元素绑定到我的视图模型中使用John Resig's simple javascript inheritance 构建的可观察对象之一。

<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 的instance

已编辑

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

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

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

【问题讨论】:

  • 请参考John Resig的简单javascript继承link
  • 我喜欢 John Resig 拒绝提及 mootools 的方式,或者 mootools 多年来一直这样做的事实。耶!

标签: javascript inheritance knockout.js


【解决方案1】:

查看此答案及其下方的答案: 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();

【讨论】:

  • 非常感谢。不幸的是,建议的解决方案不起作用。我得到“异常:ReferenceError:未定义”。
  • 抱歉,第一个示例不适用于对象字面量。我已使用有效的模式更新了示例。
  • 欲了解更多信息,请查看此问题:stackoverflow.com/questions/133973/…
  • 为我不清楚的问题道歉。 “var that = ViewModel;”对 ViewModel 的引用,而不是 ViewModel 的实例...我更新了原始问题以澄清我面临的问题。
  • 看到 "this" 引用了与 "data" 相同的对象,这是否表明 KO 将我的 "save" 方法复制到了 "data" 对象?
猜你喜欢
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多