2012-05-04 6 views
0

に従ってください。自分で試してみましたが、何か問題が発生しました。noob issueについてknockout.jsとスコープ

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はここの正しいインスタンスを参照しているようだ。誰かが私の問題を指摘できますか?

答えて

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

    // ... 

は何でもあなたに言及しますko.computed()に2番目のパラメータとして渡します。 "this"の値には "initializeViewModel"が実行される現在のコンテキストがあります。したがって、通常のようにその関数を呼び出す場合(つまりinitializeViewModel())これはグローバルオブジェクトへの参照であり、 "listing_model"(期待通り/意図したものではありません)ではありません。

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

+0

ahh ... enlighteningが参照されます。 ..ありがとう@ニコ。私はそれを試しに行くよ。 – goh

+0

質問..なぜ私のエラーメッセージがこれをdomwindowとして渡してくれないのですか? – goh

+0

申し訳ありません、あなたはそれを言い換えることができますか? 「これ」がドームウィンドウオブジェクトであるとあなたはどこで期待していますか? – Niko

0

まあ、thisは匿名関数のスコープを指しており、第2にthis.property_type()は関数呼び出しであり、変数を代入することはできません。

+0

私はドキュメントの指示に従っています。http://knockoutjs.com/documentation/computedObservables.htmlによると、ko.computedのパラメータとしてこれを渡すと、listing_modelオブジェクト自体 – goh

関連する問題