使用ember数据片段和localstorage获得一个奇怪的持久性问题

时间:2014-10-02 07:37:24

标签: ember.js ember-data

道歉,如果这不是正确的地方(相对于任何一个库拥有github问题页面,但因为我无法确切地确定哪个库不能正常工作,难以专门记录它。)< / p>

我在我的模型(数组)上使用ember数据片段,并使用localstorage来保存我的模型。在保存的模型上调用回滚时,它似乎将片段重置回原始状态(即没有值),但它仍然将片段本身保留在数组上,而不是将项目从数组中删除。

我有fiddle setup,点击“添加”添加模型,点击查看详情,然后点击“添加”,然后点击“取消”。您可以看到类型+ desc值丢失,但元素仍然存在。

如果我转而使用Fixture适配器,那么一切都按预期工作,只是不知道在哪里开始甚至尝试调试,我已经介绍了多行_super调用,以及什么不试图找出它,但是迷路了。

注意

这是我的实际应用程序的伪版本,当您导航到主页然后回到详细信息页面时,它似乎正确地解析了类型/ desc,它在我的实际应用程序上没有这样做,它仍然保持默认值。然而,刷新页面使其从那时起完美地运作。

任何帮助都非常感谢!

<!DOCTYPE html>
<html>
<head>
<script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="//builds.handlebarsjs.com.s3.amazonaws.com/handlebars-v1.3.0.js"></script>
<script src="//builds.emberjs.com/tags/v1.7.0/ember.js"></script>
  <script src="//builds.emberjs.com/canary/ember-data.js"></script>
<script src="//raw.githubusercontent.com/lytics/ember-data.model-fragments/master/dist/ember-data.model-fragments.js"></script>
<script src="//raw.githubusercontent.com/kurko/ember-localstorage-adapter/master/localstorage_adapter.js"></script>
<script>
    window.App = Ember.Application.create();    

    App.ApplicationStore = DS.Store.extend();

    App.ApplicationSerializer = DS.LSSerializer.extend();

    App.ApplicationAdapter = DS.LSAdapter.extend({
        namespace: 'cars'
    });

    App.Car = DS.Model.extend({
      make: DS.attr(),
      model: DS.attr(),
      features: DS.hasManyFragments('feature')
    });

    App.Feature = DS.ModelFragment.extend({
      type: DS.attr(),
      description: DS.attr()
    });

    App.Router.map(function () {
        this.route('index', { path: '/' });
        this.route('car', { path: '/car/:car_id'});
    });

    App.IndexRoute = Ember.Route.extend({
      model: function() {
        return this.store.find('car');
      },

      actions : {
        add: function(model) {
            var car = this.store.createRecord('car', {
                make: 'Dodge',
                model: 'Viper',
                features: []
            });
            car.save();
        }
      }
    });

    App.CarRoute = Ember.Route.extend({
        actions: {
            add: function(model) {
                model.get('features').createFragment({
                    type: 'Something',
                    description: 'Some desc'
                });
                model.save(); //*/
            },
            cancel: function(model) {
              model.rollback();
            }
        }
    });
</script>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <script type="text/x-handlebars" data-template-name="index">
        {{#link-to 'index'}}Home{{/link-to}}
        <ol>{{#each}}
            <li>{{#link-to 'car' this}}{{name}} {{model}}{{/link-to}}</li>
        {{else}}
            <button {{action 'add' model}}>Add</button>
        {{/each}}</ol>
  </script>
  <script type="text/x-handlebars" data-template-name="car">
  {{#link-to 'index'}}Home{{/link-to}}
  <dl>
    <dt>Make</dt>
    <dd>{{make}}
    <dt>Model</dt>
    <dd>{{model.model}}</dd>{{#each features}}
    <dt>{{_view.contentIndex}}. {{type}}</dt>
    <dd>{{description}}</dd>
    {{/each}}
  </dl>
  <button {{action 'add' model}}>Add</button>
  <button {{action 'cancel' model}}>Cancel</button>
  </script>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

我没有处理数据片段,但片段本身就是一个模型,所以元素/片段仍然存在,因为你已经为它创建了一个记录。
此记录存储在余烬存储中,直到您对其执行操作为止 回滚,通过emberjs.com,这样做 - “如果模型是脏的,这个功能将丢弃任何未保存的更改。”
在这种情况下,模型似乎是片段。回滚消除了更改,这就是它在您的情况下正在执行的操作,删除类型和desc值,但记录本身仍在存储中。
如果你想完全摆脱片段,你将不得不删除它。 http://emberjs.com/guides/models/creating-and-deleting-records/