使用自定义适配器创建和保存记录

时间:2013-11-18 12:24:27

标签: ember.js ember-data

我使用Ember v1.0.0和Ember-Data v1.0.0-beta.3并且在保存新创建的模型时遇到了问题。数据需要保存在API不受我们控制的服务器上,并且不是RESTful,因此我们使用自定义适配器。

我们通过一系列表单来收集用户收集模型所需的数据,我们将其保存为一个vanilla JavaScript对象,直到他们按下" save"按钮。此时,我们使用store.createRecord并传入数据对象来创建实际模型,然后调用模型的保存方法。

这会调用我们的适配器的createRecord方法,该方法将数据序列化并将其发布到服务器。此时,我们没有模型的ID,因为它由服务器生成,并在对服务器请求的响应中返回。此时,我们更新模型以获得新生成的ID。

我们遇到的问题是,在这个过程之后,当我们导航到我们的模型列表时,会出现一个" ghost"在那里建模,没有ID,以及具有正确ID的那个。此ghost模型仅存在于内存中,刷新列表时服务器不会返回。

所以,我的问题是:我们是否以正确的方式进行此操作,如果是这样,为什么鬼模型会出现?我们如何防止它发生?

编辑:这里有一些额外的信息。我在创建模型时尝试使用store.push而不是store.createRecord,但是save然后抛出一个错误,因为"空的记录"状态。

我还尝试使用unloadRecord在保存之后删除记录(当使用createRecord实例化它时),但这会失败,因为记录的状态是root.loaded.created.uncommitted或root.loaded .created.inFlight,取决于我将调用放在unloadRecord的位置。无论如何,我应该手动卸载一个剩余的对象似乎是错误的 - 它根本不应该出现,而且我不知道为什么会这样做!

3 个答案:

答案 0 :(得分:0)

您已在某处创建了“新”记录(可能在编辑操作期间)并且未保存或删除。

答案 1 :(得分:0)

我最近遇到了同样的问题,以下情况对我来说很好(这是我的一个控制器的片段):

var router = this.get('target');            
var article = this.store.createRecord('article', { name: name, size: size, quantity: quantity });
article.save().then(function(){
            article.unloadRecord();
            router.transitionTo('articles');
        });

我从promise success-callback调用“unloadRecord”方法,它确保记录已保存/更新,然后我转换到“articles”路由。虽然这有效,但我也不相信这是处理记录创建的正确方法。

答案 2 :(得分:0)

解决方案很简单,但不是我在其他地方遇到的问题。通过在返回新分配的模型ID的服务器调用之后调用store.updateId(record, { id: newId }),记录的ID将更新为新值,并且模型的类型映射会更新,以便Ember Data变为“知道”它已经有一个ID为newId的那种类型的模型。第二部分很重要,否则如果您为该类型调用find,Ember Data将创建第二个模型(具有相同的ID)。