2011-11-08 3 views
2

に動作しますなぜこの質問はである「トドス」BACKBONE.JSサンプル、についてです: http://documentcloud.github.com/backbone/docs/todos.htmlBACKBONE.JS「トドス」のサンプル - わからないコードの特定のフラグメントは

The following block of codeは、「The Application」セクションにありTodosコレクションを繰り返し処理します。私の問題は、addOne関数はTodosコレクションへの参照として渡されますが、その関数はthisへの参照を持ちます。これはTodosコレクションオブジェクトによって関数が呼び出されたときに参照されるものと同じではありません。呼び出し側がインスタンス化さAppViewオブジェクトのコンテキストでそれを呼び出していないときに

addOne: function(todo) { 
    var view = new TodoView({model: todo}); 
    this.$("#todo-list").append(view.render().el); 
}, 
addAll: function() { 
    Todos.each(this.addOne); 
}, 

なぜ機能が正しく実行しますか?

答えて

5

私はそれを試してみました。 thisはデフォルトでwindowオブジェクトを参照しており、jQueryレジスタとして$がグローバルに参照されるため、コンテキストオブジェクトなしで呼び出されても機能します。

+0

ya - あなたはほとんど「偶然によって働いている」ものに遭遇しました。彼らはおそらく '_(これ)を持っていたはずです。'this'ポインタがウィンドウではなくビューであることを保証するために、初期化でbind(" addOne ")'ステートメントを実行します。 – timDunham

+0

正確ではありません。私の答えを見て、トリックは 'bind'の第三引数です。 – s4y

+0

私は最初もそうだと思っていましたが、答えにNathanの返答を確認してください。 – timDunham

1

"jQueryまたはZeptoがページに含まれている場合、各ビューには、ビューの要素内でスコープされたクエリを実行する$関数があります。

http://documentcloud.github.com/backbone/#View-dollar

コンテキストaddOneとのaddAll両方について同じ(図)であり、これはバインド・コールに三番目のパラメータを用いて達成されます。

Todos.bind('add', this.addOne, this); 
Todos.bind('reset', this.addAll, this); 

http://documentcloud.github.com/backbone/#Events-bind

--edit

addOneがそれぞれに実行されたときうーん...再びそれらのバインドはコンテキストを確保するのですか?

addAll: function() { 
    Todos.each(this.addOne); 
}, 
+0

うん、私はビューに$プロパティがあるのを見ましたが、コードはコレクションのコンテキストで実行されていました。私が知る限り$プロパティはありません。 –

+0

ええ、本当。私はちょうど例をチェックしました。 – Heikki

0

initialize方法を見てみましょう:bind第3(オプション)の引数はコールバックが呼び出されるコンテキストであることを

initialize: function() { 
    this.input = this.$("#new-todo"); 

    Todos.bind('add', this.addOne, this); 
    Todos.bind('reset', this.addAll, this); 
    Todos.bind('all', this.render, this); 

    Todos.fetch(); 
} 

。それはhereと書かれています。バックボーンでの実装はhereです:将来のGooglerのために

callback[0].apply(callback[1] || this, args); 
+2

はい、行 'Todos.each(this.addOne);'は、コレクションの 'each'関数を直接呼び出します。 'Todos'は、渡された関数参照をビューをコンテキストとして呼び出す方法を知っていますか? –

+0

優れた点。隠密なバグのように見えます:)。 – s4y

1

は、この問題は、GitHubの上submittedだったとfixが適用されたが、それは本当に問題に対処しません。

私は、Underscore.js's_.each機能が第二(第三の選択肢を持っているので、我々はこれを行うことができますすなわち

addOne: function(todo) { 
    var view = new TodoView({model: todo}); 
    this.$("#todo-list").append(view.render().el); 
}, 

addAll: function() { 
    Todos.each(this.addOne, this); // notice the second parameter 
}, 

、この問題を解決する最良の方法は、addAll機能は、独自のthis.each反復に結合していだと思います私たちの場合)パラメータを使用して、反復のコンテキストを指定します。

関連する問題