加载Ember.View的内容时初始化jQuery插件
DEBUG: Ember.VERSION : 1.0.0-rc.6 ember.js DEBUG: Handlebars.VERSION : 1.0.0-rc.4 ember.js DEBUG: jQuery.VERSION : 1.9.1
控制器是Ember.ArrayContoller
,内容通过DS.RESTAdapter
加载。
这是我想要的代码,但它永远不会被执行。 我想为一个isLoaded
事件的controller.content
添加一个观察者。
App.ThumbnailScrollerView = Ember.View.extend({ tagName: "div", didInsertElement: function() { return this.get("controller.content").addObserver("isLoaded", function() { return $(".jThumbnailScroller").thumbnailScroller(); }); } });
这个代码被执行,但是对于每个对象,我真的只想要它用于最后一个对象。 controller.content.@each
App.ThumbnailScrollerView = Ember.View.extend({ tagName: "div", didInsertElement: function() { return this.get("controller.content.@each").addObserver("isLoaded", function() { return $(".jThumbnailScroller").thumbnailScroller(); }); } });
这也永远不会执行。 controller.content.lastObject
App.ThumbnailScrollerView = Ember.View.extend({ tagName: "div", didInsertElement: function() { return this.get("controller.content.lastObject").addObserver("isLoaded", function() { return $(".jThumbnailScroller").thumbnailScroller(); }); } });
我相信controller.content
是一个ManyArray而ManyArrays没有实现isLoaded。 他们有一个isUpdating属性。
模板:
{{#if content.isUpdating}} LOADING... {{else}} {{view App.ThumbnailScrollerView}} {{/if}}
App.ThumbnailScrollerView:
setupThumbnailScroller: function() { this.$('.jThumbnailScroller').thumbnailScroller(); }.on('didInsertElement')
由于您在Ember到达视图/模板时使用RESTAdapter
,因此观察isLoaded
已经太晚了。 这是设计和RC.6中Async路由器背后的关键思想。
当您从服务器获取数据时,使用RESTAdapter
将导致在model
挂钩中返回承诺。 路由器的工作流程是这样的,
-
model
hook通过MyModel.find
等查找数据,并返回一个promise。 - 异步路由器在看到promise并等待提取完成时暂停。
- 然后路由器调用
setupController
并连接返回控制器的数据。 - 最后调用
renderTemplate
以使用此数据呈现模板。
因此,在视图呈现时,数据已完成加载。 @each
用于迭代内容的计算属性,在此处不相关。
现在,如果我对这个问题的理解是正确的。 您有一些内容通过模型钩子加载,并在相应的模板中写出thumbnail scroller
所需的DOM。
在这些图像加载完之后,你想在目标div上调用thumnailScroller()
,这会初始化这个插件。
即: – 您希望在加载所有图像时挂钩事件,而不是在加载支持内容的数据时挂钩。
Ember不为图像加载提供任何此类事件。 您需要使用像imagesLoaded这样的外部库来执行此操作。
imagesLoaded
为诸如此类事件的事件提供回调,以便观察此类图像完成事件。 你的didInsertElement
方法是,
didInsertElement: function() { var _this = this; var loader = imagesLoaded('.jThumbnailScroller'); loader.on('always', function() { _this.$('.loader').hide(); _this.$('.jThumbnailScroller').thumbnailScroller(); }); loader.on('progress', function(loader, image) { _this.set('nowLoading', image.img.src); }); }
这是一个jsbin示例。 它使用Flickr API的jQuery promises,但同样的原则适用于ember-data的RESTAdapter
。