Dav*_*gle 21 ember.js ember-data
我很难理解在以下场景中使用的工作流程:
用户创建模型,我们称之为Product.我们为它们提供了一个表单来填写.由于某些原因除了验证之外的保存错误(超时,访问被拒绝等等)在Ember中,这会使模型进入错误状态.从UI的角度来看,我想要做的就是在屏幕上显示一条消息(简单)并允许用户再次尝试(显然不那么容易).
我已经多次写过它不会重复使用事务.我理解这个的逻辑.对于新产品,我简单地创建另一个新产品,合并来自原始产品(属性,关系)的数据,并用新产品替换我的控制器的内容.虽然可能(希望)有更好的方法,但这并不难,看起来效果很好.
但是,当我编辑产品时,我遇到了一个严重的问题,上述解决方案无效.产品模型现在处于错误状态,我找不到任何方法来获取不同状态的此产品的副本.
我无法弄清楚的是,一旦它遇到错误状态,我可以用这个模型做什么.我尝试过以下方法:
回滚:这不起作用.您无法在错误状态下回滚事务.
重新加载:与上述相同.不允许在错误状态下重新加载记录.
获取记录的新副本:所以我尝试使用与现有记录相同ID的App.Product.find(id).它只是给我一个错误状态的现有记录的副本.
我希望我在这里遗漏一些相当基本的东西.是否可以很好地从错误状态(或无效状态)滚动记录?
如果有一种简单的方法来改变这些模型的状态,我们是否还应该为进一步的提交尝试创建一个新的事务?
Dav*_*gle 14
因此,经过几天的阅读源和实验,我得出的结论是,这是尚未实现的功能.要将记录移动到另一个状态,您应该向其发送一个事件,并将其传递给它statemanager.似乎没有在错误状态上注册的事件允许我们恢复记录.
有一个丑陋的解决方法-我可以打电话transitionTo的statemanager记录,并迫使它进入我们想要的状态.我没有决定轻易做到这一点,但此时我必须继续进行项目,同时等待ember-data进化.因此,如果记录到目前为止未保存,我们可以通过调用以下方法将其从无效或错误状态中解救出来:
model.get('stateManager').transitionTo('loaded.created.uncommitted')
或者对于现有记录:
model.get('stateManager').transitionTo('loaded.updated')
调用此函数后,您可以尝试再次对模型所在的事务调用commit.这将是默认事务,因为ember-data的行为是在调用commit后将模型移动到默认事务中这是原始交易.您始终可以通过调用来检索模型的当前事务model.get('transaction')
所以在最后,我有一种方法可以创建我们可能在Ruby on Rails中看到的典型CRUD场景,但我不相信这是实现它的理想方式.但我确实相信,在这个时间点,余烬数据团队也没有.
对于那些有兴趣将CRUD功能作为控制器和路由混合Ember的人,我有一个Gist包含我目前使用的代码.这工作正常,从保存错误和验证错误中恢复.希望随着ember-data的发展,我可以继续改进它.
小智 8
通过在1.0.0-beta5中添加DS.Errors(请参阅https://github.com/emberjs/data/commit/994f3b234ef899b79138ddece60d8b214c5449e3),您应该可以致电...
record.get("errors").clear();
Run Code Online (Sandbox Code Playgroud)
这将清除以前的错误和触发器becameValid.
| 归档时间: |
|
| 查看次数: |
3714 次 |
| 最近记录: |