Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 当处于错误状态时,如何处理余烬数据模型?_Ember.js_Ember Data - Fatal编程技术网

Ember.js 当处于错误状态时,如何处理余烬数据模型?

Ember.js 当处于错误状态时,如何处理余烬数据模型?,ember.js,ember-data,Ember.js,Ember Data,我正在努力理解以下场景中使用的工作流: 用户创建一个模型,我们称之为产品。我们给他们一张要填写的表格。在Ember中,由于验证以外的原因(超时、拒绝访问等)而保存错误会使模型处于错误状态。从UI的角度来看,我只想在屏幕上显示一条消息(简单),并允许用户重试(显然不是那么简单) 我见过很多次不重用事务的代码。我理解其中的逻辑。对于新产品,我只需创建另一个新产品,合并原始产品中的数据(属性、关系),并用新产品替换控制器的内容。这并不难,看起来效果不错,尽管(希望)可能有更好的方法 然而,当我编辑一个

我正在努力理解以下场景中使用的工作流:

用户创建一个模型,我们称之为产品。我们给他们一张要填写的表格。在Ember中,由于验证以外的原因(超时、拒绝访问等)而保存错误会使模型处于错误状态。从UI的角度来看,我只想在屏幕上显示一条消息(简单),并允许用户重试(显然不是那么简单)

我见过很多次不重用事务的代码。我理解其中的逻辑。对于新产品,我只需创建另一个新产品,合并原始产品中的数据(属性、关系),并用新产品替换控制器的内容。这并不难,看起来效果不错,尽管(希望)可能有更好的方法

然而,当我编辑一个产品时,我遇到了一个严重的问题,上面的解决方案不起作用。产品模型现在处于错误状态,我无法找到任何方法来获取该产品的副本,该副本也不处于相同状态

我搞不清楚的是,一旦这个模型进入错误状态,我能对它做些什么。我尝试了以下方法:

回滚:这不起作用。无法回滚处于错误状态的事务

重新加载:同上。不允许重新加载处于错误状态的记录

抓取该记录的新副本:因此我尝试使用与现有记录相同的id来查找App.Product.find(id)。它只是给了我一个现有记录的副本,处于错误状态

我希望我错过了一些基本的东西。是否可以很好地将记录从错误状态(或无效状态)中滚出来


如果有一种简单的方法可以更改这些模型的状态,那么我们是否仍要创建一个新事务以供进一步尝试提交?

您可以尝试创建一个模型的并行表示形式,作为一个未持久化但与持久化模型具有相同属性的Ember.Object。如果ajax在错误状态下反弹,则可以使用ajax方法提供的错误回调来执行某些操作

在这种情况下,“something”可能是删除记录,然后将虚拟对象的属性克隆到新记录中并重新保存记录。在成功回调时,只需销毁临时对象,如果所有记录都是干净的,则清除临时对象(以防止临时对象滞留)


这也可能是疯狂的。。。但我觉得这是一个选项。

您可以在其上触发
becameValid
事件:

record.send("becameValid");

这将使模型转换为未提交状态。

因此,在阅读源代码并进行了几天实验之后,我得出结论,这是尚未实现的功能。要将记录移动到另一个状态,您需要向其发送一个事件,并通过
statemanager
传递它。错误状态上似乎没有注册任何事件,允许我们恢复记录

有一个难看的解决方法-我可以在记录的
statemanager
上调用
transitiono
,并强制它进入我们想要的状态。我并没有轻率地决定这么做,但在这一点上,我必须在等待余烬数据发展的同时继续这个项目。因此,如果记录尚未保存,我们可以通过调用以下命令将其从无效或错误状态中拯救出来:

model.get('stateManager').transitiono('loaded.created.uncommitted')

或对于现有记录:

model.get('stateManager').transitiono('loaded.updated')

一旦调用了它,您就可以尝试对模型所在的事务再次调用commit。这将是默认事务,因为ember数据的行为是在对其原始事务调用commit后将模型移动到默认事务中。通过调用
model.get('transaction')

最后,我有了一个方法来创建典型的CRUD场景,我们可能会在RubyonRails中看到,但我认为这不是一个理想的方法。然而,我确实相信,在这个时候,余烬数据团队也不这么认为


对于那些对CRUD功能感兴趣的人来说,我有一个包含我当前使用的代码的示例。这工作正常,可以从保存错误和验证错误中恢复。希望随着余烬数据的发展,我能继续完善这一点。

在1.0.0-beta5中添加DS.Errors(请参阅),您应该能够调用

record.get("errors").clear();

这将清除以前的错误和触发器
becameValid

你好,史蒂夫,我感谢你尝试回答这个问题,不幸的是,解决方案不现实。即使我在创建并行对象时遇到了麻烦,但余烬模型仍然处于错误状态这一事实阻止我删除它。因此,对于新对象,我仍然无法使用余烬数据来保存或更新它。另外,作为补充说明,我不希望仅仅为了重新创建API而从API中删除内容。这不是处理数据的好方法。使用纯JS和Ajax可以解决这里的任何问题。问题是如何处理余烬数据。谢谢你的代码。然而,在使用gist中的代码时,我似乎有一个竞争条件;它强制执行
lifecyclecallback
事件发送前的状态,如果发送,它将变为未处理状态(加载状态不处理该事件)。事件尚未处理时,ember的最新版本会出错。您好!看看这条线和这条图案。看看这条线和这条图案。看看这条线和这条图案@danielgatis我看了一下你的要点,链接到