【问题标题】:Ember data localStorage Adapter: find function throws errorEmber 数据 localStorage 适配器:查找函数抛出错误
【发布时间】:2012-09-21 20:55:46
【问题描述】:

我正在为 Ember 数据滚动一个 localStorage 适配器,当我运行 find 函数时,即:

App.store.find(App.Person, 0 );

我收到此错误:

Uncaught Error: assertion failed: A data hash was loaded for a model of type App.Person but no primary key 'undefined' was provided. 

在更一般的层面上,我对“持久层”(在本例中为 localStorage )和 Ember 存储之间的关系有点困惑。将某些东西加载到商店是什么意思?这是否意味着 DS.Person 模型的实例是用数据创建的?

另外,如果您注意到我在 createRecord 方法中注释掉了一行“App.store.didCreateRecord(model, data)”,因为它也不起作用。如果在记录加载到 localStorage 后我不调用 store.didCreateRecord 会发生什么。

详情:

DS.LocalStorageAdapter = DS.Adapter.extend({

    get: Ember.get,
    set: Ember.set,

    createRecord: function( store, modelType, model ){
        var records, index, data;
        // get existing records of this model
        records = this.localStorage.get( modelType );
        index = records.length;
        data = this.get( model, 'data' );
        // set storageID of data
        data.set( 'storageID', index );

        // add data to existing records
        records[index] = data;
            // encode records
        records = JSON.stringify( records );
            // store records in localStorage
        this.localStorage.set( modelType, records );
        // App.store.didCreateRecord( model, data );

    },



    find: function( store, modelType, id ) {
        var records, model;
        records = this.localStorage.get( modelType );
        model = records[id];
        App.store.load( modelType, model );
    },

    localStorage: {
        set: function( modelType, value ){
            localStorage.setItem( modelType, value);
        },

        get: function( modelType ){
          var record = localStorage.getItem(modelType);
          record = JSON.parse(record) || [];
          return record;
        }

    }
});



//application model
App.Person = DS.Model.extend({
    name: DS.attr('string', {key: 'css_name'}),
    storageID: DS.attr('number', {defaultValue: 0, key: 'storageID'}),

});

//create a couple of records
App.store.createRecord(App.Person, {  ... } );
App.store.createRecord(App.Person, {  ... } );

//try and find one record
App.store.find(App.Person, 0);

error thrown:
Uncaught Error: assertion failed: A data hash was loaded for a model of type App.Person but    no primary key 'undefined' was provided. ember-latest.js:51
Ember.assert ember-latest.js:51
(anonymous function) ember-latest.js:131
DS.Store.Ember.Object.extend.load ember-data.js:1530
DS.LocalStorageAdapter.DS.Adapter.extend.find bookApp_1.js:111
DS.Store.Ember.Object.extend.findByClientId ember-data.js:1174
DS.Store.Ember.Object.extend.find ember-data.js:1140
findRecord webApplication.js:210
onclick

还请注意,这与之前发布的另一个问题类似: Ember Data: A data hash was loaded ... but no primary key 'undefined' was provided

虽然那里的答案似乎并不能真正解释发生了什么。

【问题讨论】:

    标签: javascript web-applications ember.js


    【解决方案1】:

    可以举出为 Ember 1.0 pre2 加载 Fixture 数据的示例

    App.store = DS.Store.create({
      revision: 11,
      adapter: 'DS.FixtureAdapter'
    });
    
    App.User = DS.Model.extend({
      email: DS.attr('string'),
      password: DS.attr('string')
    });
    
    App.User.FIXTURES = [
      {
        "id": "1",
        "email": "test@mail.com",
        "password": "password"
      }
    ];
    
    App.User.find(1).get('email')
    

    为我工作。

    【讨论】:

    • 哦,是的,自从我发布这个问题以来,Ember 数据发生了很大变化,我不知道我的问题是否仍然相关:\ 但是感谢您的回答和示例! :)
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    相关资源
    最近更新 更多