ember-data观察记录数组isLoading / isUpdating / hasUpdated? [英] ember-data observe record array isLoading/isUpdating/hasUpdated?

查看:93
本文介绍了ember-data观察记录数组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')


解决方案

确定我有一个很好的解决方案。


  1. 使用查询而不是 find

  2. 在recordArray的 didLoad 属性上绑定一个侦听器,并切换一个属性 isUpdating 控制器

  3. 观察控制器内容事件属性分开。






  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.

  1. use query instead of find.
  2. bind a listener on the didLoad attribute of the recordArray and toggle a attribute isUpdating on the controller
  3. observe the controller content and events 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆