2014-09-27 73 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 
    } 
}