2012-01-10 94 views
1

Ember.js中可以使用訂閱者/觀察者模式嗎?例如,視圖A和視圖B都偵聽模型C中的更改。這要求模型C能夠觸發自定義事件。我一直在試圖弄清楚如何在Ember.js中創建一個模型觸發器事件,但目前爲止沒有運氣。Ember.js中的訂閱者/觀察者模式

回答

0

至少在Sproutcore中,這是綁定的目的。

如果你有一個模型

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

你會再有一個控制器,如

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

然後,您可以設置控制器

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

上的內容

現在,任何訴iew可以綁定到模型對象上的數據。

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

所以,如果你曾經更改名稱

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

視圖將自動更新。

+0

其實我想要的是視圖A能夠通過模型C與視圖B進行對話。例如,如果視圖A是項目列表,則單擊關鍵字將觸發模型C中的事件。然後,視圖B監聽模型C的事件,視圖B將相應地處理事件。 – 2012-01-10 17:44:13

+0

這種情況下的模型是什麼?這將有助於獲得一些示例代碼。模型對象應該表示應用程序中的數據(從服務器加載)。你所談論的內容似乎是關於應用和視圖狀態。 – hvgotcodes 2012-01-10 18:19:59

3

我相信你正在尋找的功能在Ember.js中被稱爲「綁定」。

有噸的描述如何做你的建議是什麼,但在這裏,在主頁上的例子是一個快速回顧:

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",它不會觸發任何更改事件。