gpt4 book ai didi

ember.js - 何时调用 createRecord 以及如何处理存储事务

转载 作者:行者123 更新时间:2023-12-02 19:58:17 26 4
gpt4 key购买 nike

我刚刚开始使用 Ember.js,并且想要实现一个非常简单的流程。

在概述屏幕上,我有一个新按钮,允许用户添加记录。保存后,用户将返回到概览屏幕,在概览中他会看到新创建的记录。

用户使用 linkTo 导航到“新记录”页面

{{#linkTo locations.new}} Insert location {{/linkTo}}

这会触发以下路线,准备新模型以便将其绑定(bind)到屏幕。

App.LocationsNewRoute = Ember.Route.extend({
model: function() {
return App.Location.createRecord();
}
});

新位置屏幕的 Handlebars 模板如下所示:

<script type="text/x-handlebars" data-template-name="locations/new">
<h1>New location</h1>
Latitude : {{view Ember.TextField valueBinding="latitude"}}
Longitude : {{view Ember.TextField valueBinding="longitude"}}
<p><button {{action addItem this}}>Add record</button></p>
</script>

addItem 的实现如下:

App.LocationsNewController = Ember.ObjectController.extend({
addItem: function(location) {
this.get("store").commit();
this.get("target").transitionTo("locations");

}
});

我遇到的一些问题:

模型商店交易

  • 一旦用户导航(使用 linkTo)到新位置页面,就会创建一个空记录(使用 createRecord)。我相信这是将控件绑定(bind)到模型所必需的。
  • 我注意到,当用户填写纬度,但决定返回概览(使用 linkTo)时,部分填充的模型将放入概览中。
  • 刷新页面会删除部分填充的对象

我在使用 Ember.js 时经常注意到这一点...通过 linkTo 转换到新路由与在浏览器中刷新它之间的差异有时是巨大的。

问题:我需要使用什么模式来实现“添加新记录”流程。我只想导航到新屏幕并有一个保存/取消按钮。我只想在单击“保存”时添加记录。应该只在单击“保存”时调用 createRecord,但是如何绑定(bind)控件?

模型重复

当我的 REST 服务在执行 POST(添加记录)后返回以下(非 ember.js 标准)JSON 时:

{
"latitude": "1.123",
"longitude": "1.123",
"accuracy": null,
"_id": "517d2dcf377dcffc11000009"
}

我有以下行为:

  • 当用户填写纬度/经度并单击保存按钮时,他返回到概览,并在概览中两次找到他新创建的记录。
  • 点击“保存”后,控制台中显示错误:您的服务器返回了带有关键纬度的哈希值,但您没有它的映射。
  • 刷新页面消除了重复项。

我能够通过在执行 POST 后返回 ember.js 标准 JSON 来解决这个问题

{
"location": {
"latitude": "1.123",
"longitude": "1.123",
"accuracy": null,
"_id": "517d31457b40fcbc2a000003"
}
}

该应用程序配置为使用 _id 作为主键,因为我使用的是 mongodb。

App.Adapter = DS.RESTAdapter.extend({
serializer: DS.RESTSerializer.extend({
primaryKey: function (type){
return '_id';
}
})
});

我现在可以理解为什么 Ember.js 提示纬度键(因为它期望位置根元素),但我不明白为什么它将模型两次添加到集合中(仅使用 1 个 POST)

所以 2 个问题:

  • 我的流程出了什么问题,该如何解决?
  • 为什么当 REST API 返回非 ember.js 标准 JSON 时,我最终会得到重复项。

最佳答案

模型商店交易

将您的创作包装到新事务中。这不会阻止记录在列表中可见(您始终可以过滤列表以拒绝新记录)。在你的路由器中,你可以在退出状态时回滚事务。像这样的东西:

App.LocationsNewRoute = Ember.Route.extend({
activate: function() {
this.transaction = DS.defaultStore.transaction(),
},

model: function() {
return this.transaction.createRecord(App.Location);
}
});

在您的save 处理程序中,您想要提交记录的事务(而不是商店的默认事务)。

更新:不回滚停用

模型重复

“您的服务器返回了带有关键纬度的哈希值,但您没有它的映射。” Ember 数据尝试旁加载 JSON 中返回的每个属性/键。 Ember 数据期望返回的对象位于 JSON 中的根键下(正如您所注意到的)。

我不知道为什么你有重复的内容。

更新2:如何不显示新创建的记录

我在评论中说错了,事务中创建的记录属于find返回的数组。我忘记我已经更新了我的代码来做到这一点:

App.LocationsController = Ember.ArrayController.extend({
persisted: function() {
return this.get('arrangedContent').filter( function(contact) {
if( !contact.get('isNew') ) {
return true;
}
});
}.property('arrangedContent.@each.isNew', 'arrangedContent')
})

然后在您的模板中:

{{#each persisted}}
// whatever you need
{{/each}}

关于ember.js - 何时调用 createRecord 以及如何处理存储事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16263915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com