Ember.js Ember数据适配器PUT响应时模型更新不一致
这需要一点解释。假设我有一个简单的模型Ember.js Ember数据适配器PUT响应时模型更新不一致,ember.js,ember-data,ember-cli,Ember.js,Ember Data,Ember Cli,这需要一点解释。假设我有一个简单的模型 // models/mymodel.js import DS from 'ember-data'; export default DS.Model.extend({ myString: DS.attr('string'), myBool: DS.attr('boolean') }); …还有一条简单的路线 // routes/myroute.js import Ember from 'ember'; export default Ember.
// models/mymodel.js
import DS from 'ember-data';
export default DS.Model.extend({
myString: DS.attr('string'),
myBool: DS.attr('boolean')
});
…还有一条简单的路线
// routes/myroute.js
import Ember from 'ember';
export default Ember.Route.extend({
model: function () {
return this.store.find('mymodel', 2);
}
});
…与关联的控制器
// controllers/myroute.js
import Ember from 'ember';
export default Ember.Controller.extend({
actions: {
myClick: function(){
this.model.set('myBool', true);
this.model.save();
}
}
});
…和模板
// templates/myroute.hbs
<p id="myp">{{model.myString}} {{if model.myBool "myBool"}}</p>
<button id="myclick" {{action "myClick"}}>Mybutton</button>
简而言之:当用户单击按钮时,控制器将设置myBool=true
,并保存模型。这将发送一个PUT请求,然后使用响应将myString
更新为“newString”,但由于某些原因,myBool
没有像我预期的那样从响应更新为false。这就好像模型正在根据响应进行部分更新。也就是说,myBool
在控制器设置后保持为真
如果我的代码有问题,我希望这两个属性都不会更新。事实上,只有string属性根据响应进行更新,这是我认为这在代码中不是问题的主要原因
我正在将ember cli与ember 1.11.1和ember Data 1.0.0-beta.16.1一起使用
我在这里使用了RESTAdapter(我在ActiveModelAdapter中看到了相同的行为)
我只是在灰烬数据beta 16之后才注意到这种“回归”。Beta 14.1的表现符合我的预期(即模型更新中没有不一致之处)
有人能解释一下吗?这是一个有意改变的余烬数据,还是出于设计?考虑到这一点的潜在影响,如果这确实是一个问题,我在这里创建了一个问题报告:
// tests/acceptance/myroute-test.js
// test setup code omitted for brevity
test('visiting /myroute', function (assert) {
// Here I'm just using mockjax to mock out the adapter response to the GET request for /mymodels/2
var upid = $.mockjax({
url: '/mymodels/2',
dataType: 'json',
responseText: {
mymodel: {
id: 2,
myString: 'oldString',
myBool: false
}
},
type: 'GET'
});
visit('/myroute');
andThen(function () {
// Check the state of the markup after initial model/template load
// myBool should be false, so the "myBool" string shouldn't be rendered
// myString has a value of "oldString", so we should be able to find that
var myp = find('#myp');
assert.ok(myp.html().indexOf("myBool") === -1); // This PASSES fine
assert.ok(myp.html().indexOf("oldString") >= 0); // This PASSES fine
// Here I prepare the mock response for PUT /models/2
// NOTE that myBool has a value of false in the response
$.mockjax.clear(upid);
$.mockjax({
url: '/mymodels/2',
dataType: 'json',
responseText: {
mymodel: {
id: 2,
myString: 'newString',
myBool: false
}
},
type: 'PUT'
});
// Click the button which causes our PUT request
click('#myclick');
andThen(function () {
// PUT request finished...check the state now.
// The PUT response includes myBool=false, so the 'myBool' string should NOT be there. The response also includes myString='newString'
var myp = find('#myp');
assert.ok(myp.html().indexOf("newString") >= 0); // This PASSES
assert.ok(myp.html().indexOf("myBool") === -1); // This FAILS!!
});
});
});