2015-12-04 80 views
0

我正在處理的Ember頁面是顯示操作員及其作業的網格,並在用戶創建新作業時自動更新該列表。我當前的最佳嘗試將在頁面加載時繪製預先存在的作業,但即使可以在Ember Inspector的數據視圖中看到新作業,頁面也不會刷新使用'saveNewJob'創建的任何新作業。Ember保存後數據自動刷新

下面是一些代碼 '..snip ..' 插入專注於重要的部分:

路線/ scheduler.js

export default ember.Route.extend({ 
    model: function() { 
     return { 
      jobs: this.store.query('job', { 
      location: session.location, 
      date: session.selectedDate 
      }, 
      operators: this.store.query('operator', { 
      location: session.location 
      } 
     } 
    }, 
    action: { 
     saveNewJob: function(params) { 
     var newJob = this.store.createRecord('job',{ 
      //job properties from params 
     }; 
     var thisRoute = this; 
     newJob.save().then(function(){ thisRoute.refresh() }); 
     } 
    } 
} 

模板/ scheduler.hbs

..snip.. 
{{#each model.operators as |op|}} 
    {{operator-row operator=op jobs=model.jobs}} 
{{/each}} 

{{outlet}} 

templates/components/operator-row.hbs

<!-- Draw the grid for the operator --> 
    ..snip.. 
    <!--Draw jobs over grid --> 
    {{#if jobs.isFulfilled}} 
    {{#each jobsForOperator as |job|}} 
     {{operator-job job=job}} 
    {{/each}} 
    {{/if}} 

組件/操作員row.js

jobsForOperator: Ember.computed('jobs', function() { 
    var opId = this.operator.get('id'); 
    var retVal this.jobs.filter(function(item) { 
     return item.get('operator').get('id') === opId; 
    }); 
    <!-- Append some drawing properties to each job in retVal --> 
    ..snip... 
}, 
..snip.. 

我還沒有看到需要添加任何控制器/調度。操作員作業組件是一個簡單的div,它使用圖紙屬性在操作員行中正確放置/繪製div。

創建新工作有很多種方法,但我故意將它們排除在外,因爲它們最終都會調用'saveNewJob',並且我可以從中獲取一個console.log語句。

我試過的一個解決方案是添加'this.store.findAll('job');'然後使用'jobs:this.store.filter('job',function(){})'創建model.jobs屬性。儘管看到我的日期和地點匹配返回true,但既沒有看到現有的作業,也看不到新創建的作業。

那麼我在這裏做錯了什麼?有沒有更好的方法讓這個刷新自動發生?感謝您能給予的任何幫助。

回答

1

這種情況下有函數DS.Store.filter。你用它來代替查詢。類似這樣的:

let filteredJobs = this.store.filter(
    'job', 
    {location: session.location, date: session.selectedDate}, 
    job => job.get('location') === session.location && job.get('date') === session.selectedDate 
); 
+0

感謝您的快速回答。它看起來像預期的那樣工作,我的問題確實是Mirage沒有返回新數據。 一個問題:我是否還需要在我的路由中使用refresh(),否則這會自動更新而不刷新? – Granger44

+1

無需刷新,新商品進入商店時會自動更新。 – Keo