0

ドキュメントに従い、自分で試して、問題にぶつかりました。

initializeViewModel = function(){

    var listing_model = {
        sale_rent: ko.observable( jQuery('#id_sale_rent')),
        property_type: ko.observable( jQuery('#id_property_type').val()),
        address: ko.observable( jQuery('#id_address')),
        is_condo: ko.computed(function(){
            return this.property_type() == 'condominium';
        }, this)
    };



    listing_model.district = ko.computed(function(){

        return this.district() || this.property_type();
    }, listing_model);

    return listing_model;
}

ステートメントreturn this.property_type() == 'condominium';は例外を引き起こしますobject <object> has no method property_type()。これはスコープの問題かもしれないと思いますが、thisここでは正しいインスタンスを参照しているようです。誰かが私の問題を指摘してもらえますか?

4

2 に答える 2

2

最もクリーンな解決策は、プレーンオブジェクトではなく無名関数(クロージャを作成するため)を使用することです。

initializeViewModel = function(){
    var listing_model = new function() {
        // Close-in a reference to this object
        var self = this;

        self.sale_rent = ko.observable( jQuery('#id_sale_rent') );
        self.property_type = ko.observable( jQuery('#id_property_type').val() );
        self.address = ko.observable( jQuery('#id_address') );

        self.is_condo = ko.computed(function() {
            return (self.property_type() == 'condominium');
        });
    }();

    // ...

それ以外の場合、関数内の「this」(計算を定義する)は、ko.computed()に2番目のパラメーターとして渡すものを指します-「this」の値は、「initializeViewModel」が実行される現在のコンテキストですしたがって、その関数を通常どおり(つまりinitializeViewModel())呼び出している場合、「this」は単にグローバルオブジェクトへの参照であり、「listing_model」への参照ではありません(期待/意図されたとおり)。

マニュアルの例は、コードの例とは異なります。マニュアルではすべてが関数にラップされている間に、プレーンオブジェクトをすぐに作成しています。「new」キーワードを使用してその関数を呼び出すと、新しいオブジェクトが作成され、コンテキスト(「this」)がこのオブジェクトに設定されます。それが彼らのコードが機能する理由です。

于 2012-05-04T17:48:39.617 に答える
0

さて、thisは無名関数スコープを参照しています。次にthis.property_type()、変数を割り当てることができない関数呼び出しです。

于 2012-05-04T17:32:07.227 に答える