【问题标题】:ember-data observe record array isLoading/isUpdating/hasUpdated?ember-data 观察记录数组 isLoading/isUpdating/hasUpdated?
【发布时间】:2013-05-02 20:04:38
【问题描述】:

我正在尝试按周显示日历事件列表。关键是我试图重用 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')

编辑这是我目前的黑客。使用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')

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

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

    1. 使用query 而不是find
    2. 在recordArray的didLoad属性上绑定一个监听器并在控制器上切换一个属性isUpdating
    3. 分别观察控制器contentevents属性。

    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】:

    你可能想观察events.isLoaded并在函数的核心测试它的值。

    【讨论】:

    • 我不知道这是否是一个错误,但 isLoaded 几乎立即返回 true。我目前的技巧是在添加记录的弹幕停止后推迟函数的最后一次执行。
    • 我已将我的 hack 添加到我的示例中。让我知道你的想法。我认为这 (github.com/emberjs/data/pull/735) 是一个相关的对话。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多