2014-09-27 32 views
0

我已經連接到我的路由器中的socket.io服務器。如何在View Ember.js中觸發事件?

afterModel: function() { 
     var self = this; 

     socket.on('message', function (message) { 
      // adding message to Ember.DS 
     } 
} 

灰燼追加消息div的,但是當滾動成爲展示我需要讓灰燼滾動下來。我可以用這樣的jQuery來做到這一點

Ember.$('.messages-area').scrollTop(1000000); 

但是,我需要綁定此操作的事件偵聽器?

回答

0

我需要模型OBSERV chaning和改變後添加向下滾動到Ember運行循環。

recordsDidChanges: function(){ 
    Ember.run.schedule('afterRender',this, function(){ 
     var msgArea = $('.messages-area'); 
     if (msgArea[0]) { 
      msgArea.scrollTop(msgArea[0].scrollHeight); 
     } 
    }); 
}.observes('[email protected]') 
1

取決於你如何做到這一點,你可以用一個行動處理器 - 在這裏看到:Ember - handling actions in views

視圖的事件處理程序的完整列表在這裏:

http://emberjs.com/api/classes/Ember.View.html#toc_event-names

如果你可以利用一個的預定義的處理程序,它無疑將是更清潔的邏輯。然而,聽起來你可能無法做到這一點,因爲你不是通過用戶交互直接輸入文本到div。然後你需要做的是在你的didInsertElement方法中,有一個jQuery循環檢查正在更新的div的內容,然後在內容更新時運行滾動。

+0

問題,我無法綁定到變化事件,因爲它適用於窗體。 ('。messages-area')。trigger('msg-received')當收到新消息時,並在didInsertElement中添加事件監聽器Ember。$('。messages-area')。bind ('msg-received',function(){})。但是,它符合安伯哲學的正確方向嗎? – Dmitro 2014-09-27 13:55:32

+0

我認爲這會編程方式很好,並且符合Ember哲學,因爲您正在有效地擴展默認事件綁定。我理解這種挫敗感,因爲你想在視圖中執行你的視圖邏輯,並且在控制器中執行你的程序邏輯。 – 2014-09-27 14:05:44

+0

我試圖使用觀察者,它在更改模型屬性時觸發,但在將元素插入到DOM之前觸發( – Dmitro 2014-09-28 15:49:48

0

Ember不鼓勵事件綁定,而是通過事件委託來捕獲用戶事件。

就你而言,你可以將你的代碼放在View中。

例如,假設我有一個應用程序模板:

<div id="div1">Click this area</div> 
<div id="div2">Click this area</div> 

然後,你可以捕捉ApplicationView像單擊事件,

click:function(event){ 
    if(event.target.attr('id')==='div1'){ 
     //do stuff here 
    } 
}