这需要一些解释。假设我有一个简单的模型......
// 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>
这是一个基本的验收测试:
// 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!!
});
});
});
简而言之:当用户点击按钮时,控制器会设置myBool=true
并保存模型。这会发送一个PUT请求,然后使用响应将myString
更新为“newString”,但由于某种原因myBool
未按照我的预期从响应中更新为false。这就像模型正在从响应中部分更新。也就是说,myBool
在控制器设置后保持为真。
如果我的代码出现问题,我希望这两个属性都不会更新。事实上只有字符串属性根据响应进行更新是我认为这不是我的代码中的问题的主要原因。
我正在使用带有Ember 1.11.1和Ember Data 1.0.0-beta.16.1的ember-cli。
我在这里使用RESTAdapter(我看到与ActiveModelAdapter的行为相同)。
我只注意到ember-data beta 16之后的这种“回归”.Beta 14.1表现得像我预期的那样(即模型更新中没有不一致)。
有人可以对此有所了解吗?这在某种程度上是Ember-Data的预期变化,还是按设计进行?