2011-12-22 4 views
5

У меня есть панель грида, которая, когда я покидаю страницу, хочу проверить, есть ли какие-либо элементы в магазине (или перебирать по моделям/записям), чтобы проверить, есть ли несохраненные изменения/дополнения.Проверьте, был ли отредактирован магазин (или записи)?

Первоначально я пытался использовать panel.getStore().getNewRecords() для новых записей, но он возвращает каждую запись, в которую в данный момент загружается. panel.getStore().getUpdatedRecords(), кажется, игнорирует записи, несмотря на то, что линии в сетке имеют маленький красный треугольник в каждой ячейке.

Может ли кто-нибудь посоветовать о правильном способе проверки наличия новых или обновленных записей в магазине?

ответ

16

Это может сработать для вас.

var records = store.getRange(); 

for (var i = 0; i < records.length; i++) { 
    var rec = records[i]; 

    if (rec.dirty == true) { 
     //Save data 
    } 
} 
1

Я использую это:

isStoreModified: function(store) 
{ 
    var modifiedRecords = store.getModifiedRecords(); 
    return modifiedRecords && modifiedRecords.length && modifiedRecords.length > 0; 
}, 
+0

TypeError: Object [object Object] не имеет метода 'getModifiedRecords' –

+0

Какую версию Ext Js вы используете? Функция находится в AbstractStore, и я дважды проверял поиск исходного кода Ext Js 4.1.3 и 4.2.1. См. Это: http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.data.AbstractStore-method-getModifiedRecords – costa

0

я на основе этого ответ на @theboulderer. Я знаю, что это старый поток, но я подумал, что это может быть полезно для других, кто найдет эту страницу.

Я использую модель MVC, поэтому имейте это в виду.

Все, что вам нужно сделать, это передать магазин функции, и он возвращает логическое значение.

Использование:

if (this.isDirtyStore(myStore)){ 
    ... 
} 

Функция:

isDirtyStore: function(theStore){ 
    var isDirty = false; 

    theStore.each(function(item){ 
     if(item.dirty == true){ 
      isDirty = true; 
     } 
    }); 
    if (!isDirty){ 
     isDirty = (theStore.removed.length > 0); 
    } 
    return isDirty; 
} 
4

Вы можете использовать что-то вроде этого:

если (.. Panel.getStore() getModifiedRecords() длина> 0) { console.log («магазин имеет грязные записи»); }

+1

Не учитывает снятые записи ... – HDave

10

Для того, чтобы инкапсулировать грязную контрольную логику, я решил добавить метод isDirty() к объекту Ext.data.Store. Я использовал ту же логику, которую использует AbstractStore.sync(), чтобы определить необходимость синхронизации хранилища.

Ext.define(null, { 
    override: "Ext.data.Store", 
    isDirty: function() { 
     return (this.getNewRecords().length > 0 || this.getUpdatedRecords().length > 0 || this.getRemovedRecords().length > 0); 
    } 
}); 

Я использую ExtJS 4.2.1. Если все ваши записи возвращаются при вызове getNewRecords(), вы должны проверить, что вы установили для своей модели значение idProperty.

+0

Brilliant ... perfect , – HDave

0

Ответ на shw в этой теме How do I get the dirty records from an ExtJS data store?, отвечает на ваш вопрос.

Фокус в том, что читателю магазина необходимо назначить idProperty, или все строки считаются новыми.

Они также предоставляют пример.

0

Если вы новичок перекрывая здесь @jstrickers ответ для Mvc программы в стиле:

Создать:

Ext.define('YourFolder.overridefolder.DataStore', { 

    override: "Ext.data.Store", 
    isDirty: function() { 
     return (this.getNewRecords().length > 0 || this.getUpdatedRecords().length > 0 || this.getRemovedRecords().length > 0); 
    } 

}); 

Добавить этот файл в нужную папку и указать на него в app.js ' required ', тогда isDirty будет доступен в вашем файле ext.data.store

Отлично работает, и функция будет доступна, если вам это нужно.

Смежные вопросы