2011-08-24 8 views
3

私はSproutcoreをかなり新しくしましたが、私はハンドルバーに精通しています。私はTodoのチュートリアルを歩き、いくつかの他のサンプルもチェックアウトしました。Sproutcore 2でのカスタムコントロールの作成

私はそれについてすべてを愛していて、バックボーンで使用したいと思っていますが、私はカスタムコントロールを配線する方法を理解するのに苦労しています。データの一部がバインディングにどのように反映されるのか分かりますが、失われたイベントをトリガーします。

例として、私がそれ以下のデータをフィルタリングするために使用したいリンクリストがあれば、私はイベントに結びついていますか?私はバックボーンであなたがイベントとセレクターを使用することを知っています: "クリック.link"

ご協力いただければ幸いです!

+0

あなたはのいくつかを示すことができましたあなたのコード。一般に、SC.Viewをカスタムコントロール用にサブクラス化する必要があります。オブジェクトのすべてのプロパティをバインド/観察できます。唯一のことは、常にオブジェクト上で.get/.setを使用する必要があることです。さもなければ、バインディング/観察は機能しません –

答えて

8

オブジェクトのリストをループしてクリックしたときに、元のオブジェクトにアクセスできるJavaScriptコードを呼び出すリンクを作成するように思えます。

これを行う最も簡単な方法は、テンプレートコンテキストを新しいカスタムビューにバインドすることです。あなたはこのJSFiddleでアクションのすべてを見ることができます:http://jsfiddle.net/67GQb/

テンプレート:

{{#each App.people}} 
    {{#view App.PersonView contentBinding="this"}} 
    <a href="#">{{content.fullName}}</a> 
    {{/view}} 
{{/each}} 

アプリケーションコード:

App = SC.Application.create(); 

App.Person = SC.Object.extend({ 
    fullName: function() { 
     return this.get('firstName') + ' ' + this.get('lastName'); 
    }.property('firstName', 'lastName') 
}); 

App.people = [ 
    App.Person.create({ firstName: "Yehuda", lastName: "Katz" }), 
    App.Person.create({ firstName: "Tom", lastName: "Dale" }) 
]; 

App.PersonView = SC.View.extend({ 
    mouseDown: function() { 
     // Note that content is bound to the current template 
     // context in the template above. 
     var person = this.get('content'); 
     alert(person.get('firstName')); 
    } 
}); 

言った、我々はこれは少し面倒であることを理解し、そしていくつかのアイデアを持っています今後の数週間で取り組む予定のプロセスをさらに合理化するためのものです。

+0

#collectionステートメントをコントローラにバインドしても可能ですか? –

+1

こんにちはYehuda、私たちは2年後、あなたは更新がありますか? – nraynaud

0

イェフダは、上記のやっていることを達成するための別の方法は、#collectionディレクティブを使用することです:

テンプレートコード:

{{#collection App.PeopleView contentBinding="App.people"}} 
    <a href="#">{{content.fullName}}</a> 
{{/collection}} 

アプリケーションコード:

App = SC.Application.create(); 

App.Person = SC.Object.extend({ 
    fullName: function() { 
     return this.get('firstName') + ' ' + this.get('lastName'); 
    }.property('firstName', 'lastName') 
}); 

App.people = [ 
    App.Person.create({ firstName: "Yehuda", lastName: "Katz" }), 
    App.Person.create({ firstName: "Tom", lastName: "Dale" }) 
]; 

App.PeopleView = SC.CollectionView.extend({ 
    itemViewClass: SC.View.extend({ 
     mouseDown: function() { 
      var person = this.get('content'); 
      alert(person.get('firstName')); 
     } 
    }) 
}); 
関連する問題