Ember-data monitoring an array of records isLoading / isUpdating / hasUpdated?

I am trying to display a list of calendar events by week. A kicker is an attempt to reuse data already in DS.Store. This is the code that does this and for the most part works.

The problem is that my eventsChanged observer works too many times. When the router retrieves events from the server, the eventsChanged observer eventsChanged triggered for each entry. I understand why this is happening. What I am not getting is why there is no way to check if recordArray is being executed by loading a batch of records.

Does anyone 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 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 ') 
+4
source share
2 answers

Ok, I have a good solution.

  • use query instead of find .
  • associate the listener with the didLoad attribute of the didLoad record and switch the isUpdating attribute to the controller
  • Observe the content and events controller 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 
+2
source

You might want to watch events.isLoaded and check its value in the core of the function.

0
source

Source: https://habr.com/ru/post/1242039/


All Articles