- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的必填信息:
DEBUG: -------------------------------
DEBUG: Ember : 1.3.1
DEBUG: Ember Data : 1.0.0-beta.7.f87cba88
DEBUG: Handlebars : 1.0.0
DEBUG: jQuery : 1.10.2
DEBUG: -------------------------------
以下是相关模型:
App.Destination = DS.Model.extend({
label: DS.attr('string'),
destinationMatchRules: DS.hasMany('destinationMatchRule', { async: true }),
chargeRules: DS.hasMany('chargeRule', { async: true }),
});
App.ChargeRule = DS.Model.extend({
startDate: DS.attr('date'),
endDate: DS.attr('date'),
costPerMinute: DS.attr('number'),
countryCode: DS.attr('string'),
label: DS.attr('string'),
connectionCost: DS.attr('number'),
destination: DS.belongsTo('destination', { async: true }),
});
App.DestinationMatchRule = DS.Model.extend({
pattern: DS.attr('string'),
priority: DS.attr('number'),
destination: DS.belongsTo('destination', { async: true }),
});
我有一个 destination.edit
路由/ Controller /模板,可以让我一起创建或编辑它们。如果我从头开始创建一个新集并将它们全部连接起来,我将使用此代码来保存所有内容:
save: function() {
var destination = this.get('content');
destination.save().then(function(){
var promises = Ember.A();
destination.get('destinationMatchRules').forEach(function(item){
promises.push(item.save());
});
destination.get('chargeRules').forEach(function(item){
promises.push(item.save());
});
Ember.RSVP.Promise.all(promises).then(function(resolvedPs){
alert('All saved!');
});
});
}
而且有效!人们非常高兴。
但是。如果我使用相同的路线和代码来编辑一个现有的图表——比如我编辑目的地的标签和/或 destinationMatchRule 的优先级——我在 belongsTo('destination' , { async: true })
关系。
我在序列化器的 serializeBelongsTo
方法和整个 save
方法中都设置了断点。似乎发生了以下情况:
hasMany
中的
DestinationMatchRule
和
ChargeRule
对象不是新创建的记录,则调用
.save() Destination
记录上的
自动尝试将记录保存在
hasMany
中,因此显式子记录
item.save()
在这种情况下,我上面的
save
方法中的调用被抢占了。 (我想……这是我不太确定的部分)
DestinationMatchRule
和 ChargeRule
记录调用序列化程序的 serializeBelongsTo
方法时,destination
属性每个都是 DS.PromiseObject
,并且 promise 是 Unresolved 。这导致 serializeBelongsTo
添加 destination: undefined
到 JSON 对象,并最终导致 destination
属性被完全删除来自发送到后端的序列化 JSON。自然地,这会导致我的后端认为子记录的 destination
对象已被删除(在我的情况下会导致基数违规)。
当我将日志记录语句放在显式
item.save()
调用附近时,我看到的是
DS.PromiseObject
是 解决了,这就是为什么我总结我在上面 #1 中描述的内容。我首先尝试以各种方式包装这些调用
Ember.run.next
回调以尝试给
belongsTo
时间来解决,但如果我对#1 的看法是正确的无论如何都帮不上忙。但这也意味着我没有地方尝试解决这个问题!
有人能帮我解决这个问题吗——我已经很接近了,我认为这可能是让 Ember 数据实际工作并用于“雄心勃勃”的 Web 应用程序的最后一场战斗。
更正,我对这里的操作顺序的结论是不正确的。事实上,我可以通过使我的save
方法看起来像这样来使其适用于新创建的图形和编辑现有图形:
save: function() {
var destination = this.get('content');
destination.save().then(function(){
//var promises = Ember.A();
destination.get('destinationMatchRules').forEach(function(item){
item.get('destination').then(function(){
item.save();
});
//promises.push(item.save());
});
destination.get('chargeRules').forEach(function(item){
item.get('destination').then(function(){
item.save();
});
});
//Ember.RSVP.Promise.all(promises).then(function(resolvedPs){
// alert('All saved!');
//});
});
}
但是,这不能很好地扩展:如果我有更多 belongsTo
关系怎么办?他们可能都必须安定下来吗?此外,现在更难判断整个操作何时完成——我无法将 item.save()
返回的 promise 添加到我的 promises 数组中,因为它不是立即创建的(hints on this欢迎评论)。而且,我是否应该 then
一些我没有看到的其他 promise ,以确保 destination.save()
真的真的 完成,并且所有关系都已传播?
最佳答案
作为答案发布,因为这现在看起来是一个很好的通用解决方案。但如果这是必要的,我真的很想知道代码中是否已经有一种方法可以更简洁地处理它,我正在复制一些东西……
尽管如此,我正在做的是解决这个问题,我在 DS.Model
上创建了一个名为 saveWhenSettled
的新方法,它返回一个 Promise
:
DS.Model.reopen({
saveWhenSettled: function() {
var record = this;
return new Ember.RSVP.Promise(function(resolve, reject){
var promises = Ember.A();
record.eachRelationship(function(rel){
if(record.get(rel).then) promises.pushObject(record.get(rel));
});
Ember.RSVP.Promise.all(promises).then(function(){
record.save().then(function(result){
resolve(result);
}, function(reason){
reject(reason);
});
}, function(reason){
reject(reason);
});
});
}
});
现在我可以:
save: function() {
var destination = this.get('content');
destination.save().then(function(){
var promises = Ember.A();
destination.get('destinationMatchRules').forEach(function(item){
promises.push(item.saveWhenSettled());
});
destination.get('chargeRules').forEach(function(item){
promises.push(item.saveWhenSettled());
});
Ember.RSVP.Promise.all(promises).then(function(resolvedPs){
alert('All saved!');
});
});
}
所以我收到了完成通知,它会自动处理记录中需要解决的多个关系(自发布问题以来我已经遇到过)。
再一次,我希望有人告诉我我重复了基线代码,我应该用另一种方式来做。
可能会使用类似的方法来推广我的save
方法以首先自动保存所有子关系,但我会将其留给读者作为练习。
关于serialization - belongsTo promise 在序列化修改后的记录时未解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22245793/
class Owner { static hasMany = Dog } class Sitter { static hasMany = Dog } class Dog { s
如果我有以下型号: module.exports = function (sequelize, DataTypes) { var WorkingCalendar = sequelize.defin
我有这样的问题 - 有 3 个表,例如 Clients、Hats、Tshirts。每个客户都有一顶帽子和一件 T 恤关系。我是这样做的: ` ClientsModel: var $name
我使用 Laravel 5.6,我有 3 个模型: 地区 商店 商家 区域有很多商店: public function stores() { return $this->hasMany('Be
我已经在几个地方看到过要“远离”这一点,但是唉 - 这就是我的数据库的构建方式: class Album extends Eloquent { // default connection
如何制作域类以在 Grails 中创建“共享”数据但不“属于”另一个数据的表?例如,我想制作 2 张 table : 具有 2 个主要列的人员表 名称 - 技能 拉里 - 跳跃,大笑,拳击 curl
当子类可能属于父类中的两个属性之一(但不能同时属于两者)时,我无法理解 Grails 中的 belongsTo - hasMany 关系的概念。 例如: class Store { Integ
我创建了Child域,并为其添加了2个父级。我声明为一位 parent 。我在belongsTo约束的帮助下声明了另一个 parent 。 打包多个 parent class Child {
场景一: 我有两个类: 发表 : class Post { String content Date dateCreated static constraints = { content(blank:
我以为答案是很基本的,但是我对Grails还是很陌生,并且在其他任何地方都很难找到我的问题的答案。 基本上,我有两个域类,用户和事件。事件与用户具有“belongsTo”关系,而用户与事件具有“has
要在 Grails 中创建一对一关系,我可以执行以下操作: class Person { static hasOne = [address: Address] } 在这种情况下,地址表具有其人
有人告诉我,要完成将 $belongsTo 映射到非主键,我会将外键设置为 false 并由另一个论坛上的某人(实际上是 IRC)设置条件。但是,我不认为我这样做是正确的。下面是我正在尝试的 $bel
所以我有这个模型,“票”,其中包含(除其他外)“category_id”列。 为简化起见,以下是我的数据的外观: 门票表 ID 标题 类别编号 1 问题 #1 2 2 问题#2 4 3 问题 #3 1
class Batch extends Eloquent { public function coupons() { return $this->hasMany('Coupon
谁能向我解释在ManyToMany关系中belongsTo的作用是什么?对于OneToOne关系,这很明显:如果删除了“OneToMany”侧(主表)中的记录,则相应的“ManyToOne”(子表)也
我有一些模型正在尝试关联。 一种模型是 Item,一种是 Slide,另一种是 Asset。 项目下方有多个幻灯片。 Assets 基本上是已上传的文件(图像、mp3 等),幻灯片是显示 Assets
我正在尝试保存属于另一个模型的记录。然而,我得到一个错误,指出外键丢失。 CakePHP 文档显示了此工作的示例,但我无法让它工作。 这是表格: echo $this->Form->creat
好的必填信息: DEBUG: ------------------------------- DEBUG: Ember : 1.3.1 DEBUG: Ember Data : 1.0.0-b
我有一个顾问表,它有一个链接到“specilaties”表的外键“specialty_id”。 class Consultant extends AppModel { public $belo
我正在处理 belongsTo 关系,但需要知道如何指定要关联的字段。 我有一个报告和一个汽车表。 汽车表以 ID 字段作为 UI。当对汽车进行报告时,我希望从列表中删除该汽车,以便我使用示波器。 在
我是一名优秀的程序员,十分优秀!