ember-data观察记录数组isLoading / isUpdating / hasUpdated? [英] ember-data observe record array isLoading/isUpdating/hasUpdated?
问题描述
我正在尝试按周显示日历活动列表。我正在尝试重新使用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数组日期
controller.setProperties
内容:天
事件:事件
App.CalendarWeekController = Em.ArrayController.extend
itemController:'calendarDay'
事件:null
eventsChanged: ( - >
#如果更多的记录被安排加载,则不运行
#return if @get'events.isUpdating'
days = @获取'内容'
children = @get'_subControllers'
events = @get'events'
user = @get'user'
返回除非天和孩子和事件和用户
days.forEach(date) - >
controller = children.findProperty'content',date
content = events.filter(ev ent) - >
(event.get('date')是date)和
(event.get('user')是用户)
如果内容
控制器。设置'内容',内容
).observes('content','events。@ each')
编辑这是我目前的黑客。使用非官方Ember.debounce
eventsChanged:( - >
days = @get'content'
children = @get'_subControllers'
events = @get'事件'
user = @get'user'
返回,除非天和孩子,事件和用户
days.forEach(date) - >
controller = children.findProperty'content',date
content = events.filter(event) - >
(event.get('date')是date)和
(event) get('user')是用户)
如果内容
controller.set'content',content
).observes('content','didUpdate')
notifyEventsChanged:Ember.debounce(
@
(_this) - >
_this.notifyPropertyChange('didUpdate')
200
false
).observes('events。@ each')
确定我有一个很好的解决方案。
- 使用
查询
而不是find
。 - 在recordArray的
didLoad
属性上绑定一个侦听器,并切换一个属性isUpdating
控制器 - 观察控制器
内容
和事件
属性分开。
CalendarWeekRoute = Ember.Route.extend
setupController:(controller,model) - >
login = model.get'login'
week = model.get'week'
events = App.Event.all()
newEvents = App.Event.query({
isUpdating:true
content:days
事件:事件
newEvents.on'didLoad', - > controller.set('isUpdating',false)
App.CalendarWeekController = Em.ArrayController.extend
itemController:'calendarDay'
content:( - >
@update()
).observes('content')
eventsChanged:( - >
@update()除非@get'isUpdating'
).observes('events。@ each','isUpdating')
更新: - >
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')是date)和
(event.get('user')是用户)
controller.set'content',content
I am trying to display an list of calendar events by week. The kicker is I am trying to reuse data already in the DS.Store. This is the code that does it and for the most part it works.
The problem is my eventsChanged
observer is running way too many times. When the router fetches events from the server the eventsChanged
observer fires for each record. I understand why that happens. What I don't get is why there is not a way to check if the recordArray is done loading a batch of records.
Does anybody have any suggestions?
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')
EDIT This is my current hack. Using the unofficial Ember.debounce
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')
Ok I have a good solution.
- use
query
instead offind
. - bind a listener on the
didLoad
attribute of the recordArray and toggle a attributeisUpdating
on the controller - observe the controller
content
andevents
attributes separately.
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
这篇关于ember-data观察记录数组isLoading / isUpdating / hasUpdated?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!