2014-04-15 77 views
1

我有一個存儲與本地存儲代理,但我無法保存數據。 的代碼非常簡單:ExtJs - 無法將商店保存到localStorage

onToolbarTicketsadd: function(me){ 
    var tickets = this.getStore('Tickets'); 
    tickets.add({id: 1, name: 'new'}) 
    console.log(tickets.getById(1), tickets.count()) 
    tickets.sync({callback: function(){console.log('synched')}}) 
}, 

票被添加到存儲中,作爲第一個console.log證明,但sync()命令不起作用。 localStorage檢查員只顯示一個空條目Tickets: '',並且callback函數也不會被調用。

我錯過了什麼?本地存儲代理工作的必要條件是什麼?

注意:問題不在於瀏覽器:我使用最新的Chrome和Firefox。

下面是商店和模型代碼:

Ext.define('App.store.Tickets', { 
    extend: 'Ext.data.Store', 
    model: 'App.model.Ticket', 
    proxy: { 
     type: 'localstorage', 
     id: 'Tickets' 
    } 
}); 

Ext.define('App.model.Ticket', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'id', type: 'int'}, 
     {name: 'name', type: 'string'} 
    ] 
}); 

問題的演示是here

+0

您的演示鏈接似乎打破了,你能提供一個小提琴嗎?行爲看起來很奇怪,導致其如此基本 –

+0

不,它沒有被破壞,它只需要很多時間來加載。那麼我找到了解決方案... –

回答

2

如果您想保留id專門用於您自己的字段名稱,然後手動將模型上的idProperty設置爲其他東西似乎可以解決問題 - 請參閱此working demo。但請注意,如果需要,您必須在屬性上執行您自己的唯一性。

Ext.define('MyModel', { 
    extend: 'Ext.data.Model', 
    idProperty: '_id', // <-- here 
    fields: [ 
     {name: 'id', type: 'int'}, 
     {name: 'name', type: 'string'} 
    ] 
}); 
3

這花了我很多時間去尋找。問題是由於Extjs確定記錄何時需要同步的方式:phantom屬性。

要向商店添加新記錄,您不得給id。這將無法正常工作(因爲ID設置,該記錄將不被標記爲phantom,並且它不會同步的):

store.add({id: 1, name: 'new'}) 
store.sync() 

這將工作:

store.add({name: 'new'}) 
store.sync() 

還有一個通過在添加記錄後設置phantom屬性,可能的解決方法。這可能是必要的,當id具有一定的意義,並不僅僅是一個自動增量值:

Ext.Array.each(store.add({id: 1, name: 'new'}), function(record){ 
    record.phantom = true 
}); 
store.sync() 

暗指在Extjs.data.Model.phantom由問題:其中有一個真正的數據庫PK設定爲id屬性的任何記錄不是幻影 - 它是真實的。
很明顯,這個陳述不一定是真的,就像第一個代碼片段中的上述內容一樣,但是由於Extjs 4.2假設它始終爲真,所以會出現該錯誤。

我希望這個解釋可以爲某些人節省幾個小時的工作。它會爲我節省一天的時間。

+1

你說得對@洛倫茨,問題是id屬性。然而,你的解決方法不是奧凱,幽靈是一個內部領域,你不應該永遠不會修改。如果id屬性很重要,那麼模型應該定義一個不同的id屬性以供內部使用。看一看模型文檔。 – lontivero