我正在尝试制作一个每 3 秒旋转一次模板的 Ember View 小部件。这是我所得到的,但它似乎不能正常工作。我是否采用正确的方法,或者任何人都可以建议如何做到这一点?
更新:
这几乎可以正常工作,但是由于更新太频繁,因此无法正确循环浏览模板。这是一个 jsfiddle。(警告,Fiddle 最终会变得无响应,因为它因 DOM 更新而过载)
App.RotatingView = Ember.View.extend
templateString: null
views: ["a", "b", "c"]
init: ->
@set 'templateString', @_getNextTemplate()
@_super()
template: (->
Ember.Handlebars.compile(@get 'templateString')
).property('templateString')
templateDidChange: (->
setInterval =>
@set 'templateString', @_getNextTemplate()
Ember.run.next => @rerender()
, 3000
).observes("templateString")
_getNextTemplate: ->
views = @get('views')
length = views.length
currentTemplateIndex = views.indexOf this.get('templateString')
if (currentTemplateIndex + 1) == length
return views[0]
else
return views[currentTemplateIndex + 1]
更新#2
我还尝试了ContainerView
下面@Unspecified 建议的方法,但我得到未定义的“无法调用方法'childViewsDidChange'。
App.RotatingView = Ember.ContainerView.extend
views: Em.A(["a", "b", "c"])
childViews: (->
views = @get('views')
return views.map (view) -> Ember.View.create({template: Ember.Handlebars.compile(view)})
).property('views.@each')
init: ->
@set 'currentView', @get('childViews.firstObject')
@_super()
viewDidChange: (->
setInterval =>
@set 'currentView', @_getNextView()
, 3000
).observes('currentView')
_getNextView: ->
views = @get('childViews')
length = views.length
currentTemplateIndex = views.indexOf this.get('templateString')
if (currentTemplateIndex + 1) == length
return views[0]
else
return views[currentTemplateIndex + 1]