我使用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的位置。无论如何,我应该手动卸载一个剩余的对象似乎是错误的 - 它根本不应该出现,而且我不知道为什么会这样做!
答案 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)。