Ember.js:如何在将新项插入ArrayController后应用jquery插件

时间:2013-01-08 17:44:34

标签: javascript ember.js

所以我有一个以非常标准的方式呈现的ArrayController:

<ul>
  {{#each controller}}
     <li>{{ user.name }} : {{message}} <abbr class="timeago" title="{{unbound datetimeFormatted}}">{{unbound datetimeFormatted}}</abbr></li>
  {{/each}}
</ul>

我想要的是在插入新项目后应用jQuery.timeAgo插件,但为了做到这一点,我不知何故应该获得对插入元素的引用。

我尝试了didInsertElement方法,但只有在渲染整个视图时才触发,我需要将此插件应用于插入DOM的每个新项目。

所以,我的问题确实可以用这样的方式表达 - 有没有办法获得对新插入的DOM元素的引用或者在将新项添加到ArrayController并附加到DOM之后触发的任何回调?

2 个答案:

答案 0 :(得分:5)

我建议使用{{each}}帮助器的无块形式来指定每个元素使用的视图类。

<ul>{{each controller itemViewClass="App.AnItemView"}}</ul>

然后像这样定义App.AnItemView:

App.AnItemView = Ember.View.extend({
  template: Ember.Handlebars.compile('{{ user.name }} : {{message}} <abbr class="timeago" title="{{unbound datetimeFormatted}}">{{unbound datetimeFormatted}}</abbr>'),
  didInsertElement : function(){
    this.$().timeago();
  }
});

答案 1 :(得分:2)

我看到了两种可能性:

1 - 在数组上设置一个观察者,每次插入一个元素时都会触发该观察者。但是你没有自动获得对新元素的引用。

yourObserver : function(){
    ...
}.observes("content.@each")

2 - 在自己的视图中包装列表项(例如:App.ListItemView)并使用didInsertElement事件:

{{#each}}
  {{#view App.ListItemView}}
    <li>... </li>
  {{/view}}
{{/each}}

App.ListItemView = Ember.View.extend({
  didInsertElement : function(){
    this.$().timeago();
  }
}