2013-05-02 20 views
4

我想按周顯示日曆事件列表。踢球者是我試圖重用DS.Store中已有的數據。這是它的代碼,它在大多數情況下工作。ember-data觀察記錄數組isUpload/isUpdating/hasUpdated?

問題是我的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', '[email protected]') 

編輯這是我目前的破解。使用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('[email protected]') 

回答

0

您可能希望觀察events.isLoaded,並在功能核心測試它的價值。

+0

我不知道這是否是一個錯誤,但真正的幾乎立即isLoaded回報。我目前的做法是在添加的記錄停止之後推遲該函數的最後一次執行。 – 2013-05-03 01:13:43

+0

我已將我的黑客加入我的示例中。讓我知道你的想法。我認爲這個(https://github.com/emberjs/data/pull/735)是一個相關的對話。 – 2013-05-03 01:19:25

2

好的我有一個很好的解決方案。

  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('[email protected]', '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 
+0

嗨,亞倫,因爲你已經在emberjs中做了一些日期的工作,你介意看看這個: http://stackoverflow.com/questions/17794581/emberjs-1-0-0-rc-6-using- enumerable-to-list-events-occurrence-on-a-special-dat。謝謝 – brg 2013-07-22 20:09:04

+0

你能否用JS寫這篇文章而不是咖啡腳本 – 2014-02-27 15:16:26

+0

@real_ate - 只需粘貼到[http://js2coffee.org/]的右邊框中 – shaunc 2014-10-21 03:41:18