2012-01-10 8 views
1

Ember.jsでサブスクライバ/オブザーバパターンを使用することはできますか?たとえば、ビューAとビューBはモデルC内の変更をリッスンします。これにより、モデルCはカスタムイベントをトリガできる必要があります。 Ember.jsでモデルトリガーイベントを作成する方法を理解しようとしていましたが、これまでのところ運がありません。Ember.jsのサブスクライバ/オブザーバパターン

答えて

0

少なくともSproutcoreでは、これがバインディングの対象となります。

あなたはその後、あなたはその後、コントローラ

App.personController.set('content', somePerson);

上のコンテンツを設定することができますよう

App.personController = SC.ObjectController.create();

コントローラを持っているでしょう

App.Person = SC.Object.extend({ 
    name: 'Bruce Banner' 
}); 

モデルを持っている場合

今、任意のvモデルはモデルオブジェクトのデータにバインドできます。

SC.LabelView = SC.LabelView.extend({ 
... 
    valueBinding: 'App.personController.name' 
}) 

あなたは

somePerson.set('name', 'Chris');

名前を変更するのであればビューは自動的に更新されます。

+0

私が探していたのは、ビューAがモデルCを通してBを表示できるようにすることです。たとえば、ビューAがアイテムのリストである場合、キーワードをクリックするとモデルCのイベントがトリガーされます。ビューBはモデルCのイベントをリッスンし、ビューBはそれに応じてイベントを処理します。 –

+0

この場合のモデルは何ですか?これは、いくつかのコード例を持つのに役立ちます。モデルオブジェクトは、アプリケーション内のデータ(サーバーからロードされたデータ)を表すものとします。あなたが話していることは、アプリとビューの状態に関するものと思われます。 – hvgotcodes

3

あなたが探している機能は、Ember.jsの「Bindings」と呼ばれています。

ありますが示唆されているものを行う方法を説明し、ホームページ上の例のトンがありますが、ここで簡単にまとめている:

window.MyApp = Ember.Application.create(); 

MyApp.MyModel = Ember.Object.create({ 
    myProperty: "Hello World!", 

    goodbye: function() { 
    this.set("myProperty", "Goodbye!"); 
    }) 
}); 

MyApp.modelInstance = MyApp.MyModel.create(); 

今すぐあなたの<body>タグ内のあなたの二つのビューを作成します。

<script type="text/x-handlebars"> 
    View1: <b>{{MyApp.modelInstance.myProperty}}</b> 
</script> 

<script type="text/x-handlebars"> 
    View2: <b>{{MyApp.modelInstance.myProperty}}</b> 
</script> 

ページがレンダリングされ、両方のビューに「Hello World!」と表示されます。コンソールを開き、タイプを入力して

MyApp.modelInstance.goodbye(); 

と入力すると、あなたの意見は「さようなら!」と変わります。

ビューでは、二重中括弧を使用してバインディングをMyApp.modelInstance.myPropertyに自動的に作成しますが、さまざまな方法でバインディングを作成できます。 myPropertyの値が変更されるたびに、すべてのバインディングが自動的に更新されます。ただし、set("myProperty", "something new")に連絡して、Emberがバインディングを更新することがわかっている必要があります。あなたがちょうどmyProperty = "something new"と言うならば、変更イベントは発生しません。