2

我有一个通过 ClientsController 显示的客户端列表,其内容设置为 Client.find(),即 RecordArray。用户通过 ClientController 创建一个新客户端,其内容在路由处理程序中设置为 Client.createRecord()。

一切正常,但是,当用户填写客户端的创建表单时,客户端列表会更新为新的客户端记录,即在路由处理程序中创建的记录。

让 RecordArray/Store 在保存记录之前只知道新记录的最佳方法是什么?

更新:我最终根据对象状态过滤了列表

{{#unless item.isNew}} Display the list {{/unless}}

更新 - 2 这是使用过滤器的另一种方法,但是必须首先通过 find 方法加载商店, App.Client.find().filter() 的行为似乎与单独调用这两种方法的行为方式不同。

// Load the store first     
App.Client.find();
    var clients = App.Client.filter(function(client){            
        console.info(client.get('name') + ' ' + client.get('isNew'));  
        return !client.get('isNew');
    });                   
    controller.set('content',clients);  
4

2 回答 2

2

解决这个问题的几种方法:

首先,处理客户端列表的路由/状态必须不遗余力地过滤掉另一个不相关状态(即 newClient 状态)留下的垃圾,这是非常混乱的。我认为在离开 newClient 状态之前删除垃圾记录会更好,a la

if(client.get("isNew")) {
  client.deleteRecord();
}

这将确保它不会蔓延到 clientIndex 路由或任何其他不需要额外工作来过滤掉垃圾记录的客户端列表路由。理想情况下,此代码将位于exit您的路由函数中,newClient因此它可以在路由器转换到另一个将调用的状态之前删除记录Client.find()

但还有一个更好的惯用解决方案:https ://gist.github.com/4512271

(不确定您使用的是哪个版本的路由器,但这两者都适用)

解决方案是使用事务:而不是createRecord()直接Client调用 on ,而是调用createRecord()事务,以便新的客户端记录与该事务相关联,然后您需要做的就是调用 transaction.rollback() in exit-- 你不'甚至不需要调用isNew任何东西,如果保存了客户端记录,显然不会回滚。

这也是编辑记录的有用模式:1)在enter状态上创建事务并将记录添加到其中,例如

enter: function(router, client) {
     this.tx = router.get("store").transaction();
     this.tx.add(client); 
},

然后在状态上进行同样的事情exit

exit: function(router, client) {
     this.tx.rollback();
},

这样,如果用户完成表单并提交到服务器,回滚将正确/方便地什么都不做。如果用户编辑了一些表单字段但在中途退出,你的回调将恢复未保存的更改,这样你就不会在你的路由exit中弹出一些肮脏的僵尸客户端显示它是未保存的更改。clientIndex

于 2013-01-12T11:55:52.650 回答
1

不是 100% 确定,你可以尝试设置 ClientsController 的内容

Client.filter(function(client){
  return !client.get('isNew'));
});

编辑:为了使这项工作,您必须首先使用 Client.find() 加载存储。

于 2013-01-09T23:24:49.743 回答