0

John Resig の単純な javascript inheritanceで構築されたビュー モデルのオブザーバブルの 1 つにバインドされた HTML 要素があります。

<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」にそれぞれ「first」と「second」としてアクセスしたいと思います。

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の興味深い部分の1つにぶつかっています。ここで、「this」は、呼び出されている関数の親オブジェクトではなく、関数を呼び出しているオブジェクトを指します。これは、以下の例のcommon that=thisパターンなどのクロージャを使用して処理できます。

Javascriptに多くの時間を費やす場合は、ダグラス・クロックフォードの本「Javascript:The GoodParts」を強くお勧めします。これにより、このような多くのことに気付くことができます。また、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 に答える