2015-12-04 81 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