週ごとのカレンダーイベントのリストを表示しようとしています。キッカーは、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の使用
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')