我正在尝试按周显示日历事件列表。更重要的是我正在尝试重用 DS.Store 中已有的数据。这是执行此操作的代码,并且在大多数情况下它都有效。
问题是我的eventsChanged
观察者运行的次数太多了。当路由器从服务器获取事件时eventsChanged
观察者为每条记录触发。我明白为什么会发生这种情况。我不明白的是为什么没有办法检查 recordArray 是否已完成加载一批记录。
有人有什么建议吗?
App.CalendarWeekRoute = Ember.Route.extend
model: (params) ->
Ember.Object.create
date: params.date
login: params.login
serialize: (model) ->
date: model.get 'date'
login: model.get 'login'
setupController: (controller, model) ->
App.Event.find
login: model.get 'login'
week: model.get 'date'
events = App.Event.all()
days = App.DaysOfWeekFor( model.get('date') ) #returns array of dates
controller.setProperties
content: days
events: events
App.CalendarWeekController = Em.ArrayController.extend
itemController: 'calendarDay'
events: null
eventsChanged: ( ->
#don't run if more records are scheduled to be loaded
#return if @get 'events.isUpdating'
days = @get 'content'
children = @get '_subControllers'
events = @get 'events'
user = @get 'user'
return unless days and children and events and user
days.forEach (date) ->
controller = children.findProperty 'content', date
content = events.filter (event) ->
(event.get('date') is date) and
(event.get('user') is user)
if content
controller.set 'content', content
).observes('content', 'events.@each')
编辑这是我当前的黑客。使用非官方 Ember.debounce https://gist.github.com/tchak/3529810
eventsChanged: ( ->
days = @get 'content'
children = @get '_subControllers'
events = @get 'events'
user = @get 'user'
return unless days and children and events and user
days.forEach (date) ->
controller = children.findProperty 'content', date
content = events.filter (event) ->
(event.get('date') is date) and
(event.get('user') is user)
if content
controller.set 'content', content
).observes('content', 'didUpdate')
notifyEventsChanged: Ember.debounce(
@
(_this) ->
_this.notifyPropertyChange('didUpdate')
200
false
).observes('events.@each')
好吧,我有一个很好的解决方案。
- use
query
代替find
.
- 绑定一个监听器
didLoad
recordArray 的属性并切换属性isUpdating
在控制器上
- 观察控制器
content
and events
属性分开。
App.CalendarWeekRoute = Ember.Route.extend
setupController: (controller, model) ->
login = model.get 'login'
week = model.get 'week'
events = App.Event.all()
newEvents = App.Event.query({login: login, week: week}, events)
controller.setProperties
isUpdating: true
content: days
events: events
newEvents.on 'didLoad', -> controller.set('isUpdating', false)
App.CalendarWeekController = Em.ArrayController.extend
itemController: 'calendarDay'
content: ( ->
@update()
).observes('content')
eventsChanged: ( ->
@update() unless @get 'isUpdating'
).observes('events.@each', 'isUpdating')
update: ->
days = @get 'content'
children = @get '_subControllers'
events = @get 'events'
user = @get 'user'
days.forEach (date) ->
controller = children.findProperty 'content', date
content = events.filter (event) ->
(event.get('date') is date) and
(event.get('user') is user)
controller.set 'content', content
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)