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!!
    });
  });
});