2011-12-22 29 views
5

Tôi có một lưới Panel, mà khi tôi rời khỏi trang, tôi muốn có một kiểm tra để xem nếu có các mặt hàng trong cửa hàng (hoặc lặp thông qua mô hình/hồ sơ) để kiểm tra nếu có bất kỳ thay đổi chưa lưu/bổ sung.Kiểm tra xem một cửa hàng (hoặc hồ sơ) đã được chỉnh sửa chưa?

Ban đầu tôi đã thử sử dụng panel.getStore().getNewRecords() để lưu bản ghi mới nhưng nó trả về mọi bản ghi hiện được phân trang. panel.getStore().getUpdatedRecords() dường như bỏ qua các bản ghi, mặc dù các dòng trong lưới có hình tam giác nhỏ màu đỏ trong mỗi ô.

Vì vậy, bất cứ ai có thể tư vấn về cách chính xác để kiểm tra nếu có hồ sơ mới hoặc cập nhật tồn tại trong một cửa hàng?

Trả lời

16

Điều này có thể phù hợp với bạn.

var records = store.getRange(); 

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

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

tôi sử dụng này:

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

LoạiError: Object [object Object] không có phương thức 'getModifiedRecords' –

+0

Bạn sử dụng phiên bản nào của Ext J? Hàm này nằm trong AbstractStore và tôi kiểm tra lại bằng cách tìm kiếm mã nguồn của Ext Js 4.1.3 và 4.2.1. Xem này: http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.data.AbstractStore-method-getModifiedRecords – costa

0

tôi dựa này ra câu trả lời bằng cách @theboulderer. Tôi biết đây là một chủ đề cũ, nhưng tôi nghĩ rằng nó có thể hữu ích cho những người khác tìm thấy trang này.

Tôi đang sử dụng mô hình MVC, vì vậy giữ cho rằng trong tâm trí.

Tất cả bạn phải làm là vượt qua các cửa hàng để các chức năng, và nó trả về một boolean.

Cách sử dụng:

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

Chức năng:

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

Bạn có thể sử dụng một cái gì đó như thế này:

if (.. Panel.getStore() getModifiedRecords() length> 0) { console.log ('cửa hàng có hồ sơ bẩn'); }

+1

Không tính đến các hồ sơ đã xóa ... – HDave

10

Để giữ logic kiểm tra bẩn được đóng gói, tôi đã chọn thêm phương thức isDirty() vào đối tượng Ext.data.Store. Tôi đã sử dụng cùng một logic mà AbstractStore.sync() sử dụng để xác định xem cửa hàng có cần đồng bộ hóa hay không.

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

Tôi đang sử dụng ExtJS 4.2.1. Nếu tất cả hồ sơ của bạn được trả lại khi bạn gọi getNewRecords(), bạn nên kiểm tra xem bạn đã đặt giá trị cho idProperty trên mô hình của mình hay chưa.

+0

Rực rỡ ... hoàn hảo . – HDave

1
if (panel.getStore().needsSync) { 
    //store have unsaved changes. 
} 
0

Câu trả lời bằng cách gửi trong chủ đề này How do I get the dirty records from an ExtJS data store?, trả lời câu hỏi của bạn.

Bí quyết là người đọc cửa hàng cần phải chỉ định một idProperty hoặc tất cả các hàng được coi là mới.

Họ cung cấp một ví dụ là tốt.

0

Nếu bạn chưa quen với trọng ở đây là @jstrickers câu trả lời cho một chương trình MVC phong cách:

Tạo:

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

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

}); 

Thêm tập tin này vào thư mục và điểm thích hợp để nó trong app.js ' bắt buộc ', khi đó isDirty sẽ có sẵn trong ext.data.store của bạn

Hoạt động tốt và chức năng sẽ có sẵn là bạn cần.

Các vấn đề liên quan