2012-02-09 23 views
16

Tôi có mô hình xương sống. Với model.set() tôi có thể thiết lập một giá trị cục bộ, với model.save() tôi có thể lưu toàn bộ mô hình vào máy chủ.backbone.js: Có thay đổi nào kể từ lần lưu cuối cùng của máy chủ không?

Làm cách nào để biết, liệu có thay đổi nào kể từ lần lưu máy chủ cuối cùng có nghĩa là phiên bản cục bộ bị bẩn.

model.isNew(); chỉ hoạt động nếu mô hình chưa bao giờ được lưu vào máy chủ.

+0

Bit bẩn không giống như kiểm tra xem nó có thay đổi hay không (tùy thuộc vào định nghĩa của bạn). Ví dụ: mô hình ban đầu có thể là: Tốt: true, thay đổi thành isGood: false, sau đó quay lại isGood: true. Các bit bẩn sẽ được trong trường hợp này, nhưng mô hình không thực sự thay đổi. Có được không? – Matt

Trả lời

16

EDIT: Câu trả lời này đã được viết trước khi phiên bản 1.0 của Backbone. Kể từ phiên bản Backbone hiện tại (1.2.2) hasChanged không còn phản ánh thay đổi "kể từ lần lưu cuối cùng" nữa. Thay vào đó, nó phản ánh thay đổi "kể từ lần cuối đặt".


Nghe sự kiện thay đổi hoặc kiểm tra hasChanged.

Nếu mô hình đã thay đổi, bạn có thể lưu thay đổi. Bạn thậm chí có thể dây phương pháp lưu của bạn để kích hoạt khi sự kiện thay đổi xảy ra.

Nếu bạn không muốn lưu thay đổi, hãy đặt thuộc tính cho mô hình bị bẩn và xóa nó khi bạn lưu một cách rõ ràng.

Cái gì như:

change: function(){ 
    this.dirty = true; 
} 

save: function(){ 
    // do your save 
    if(success){ 
     this.dirty = false; 
    } 
} 

isDirty: function(){ 
    return this.dirty 
} 
+1

Nhưng có phiên bản nào không có bit bẩn không? – knub

+0

@knub Ý bạn là gì? Xương sống không cung cấp điều này. Chúng cung cấp sự kiện 'change' và phương thức' hasChanged'. Đây là một cách để thực hiện một hệ thống dữ liệu lười biếng-lưu-chỉ-nếu-bẩn-dữ liệu. Lý tưởng nhất, bạn chỉ cần gọi 'model.save()' khi bạn nhận được sự kiện 'change'. Bằng cách đó, nếu bạn mất khách hàng, bạn không bị mất các thay đổi của họ. – tkone

+0

Tôi nghĩ có một số chức năng ẩn trong Backbone-Core có thể cung cấp thông tin đó cho tôi. Ý tôi là, Backbone có thông tin đó, nó không cung cấp cho tôi. Và bẩn bit là bẩn, bạn biết;). Nhưng ok, rõ ràng là không có giải pháp khác (chưa?). – knub

4

lựa chọn thay thế là để đặt tất cả các cập nhật của bạn để cập nhật 'im lặng', và sau đó thu thập những thay đổi khi bạn muốn đồng bộ hóa:

// Updates 
myModel.set({foo: 'bar'}, {silent: true}); // Does not fire a 'changed' event 
myModel.set({foobar: 'barfoo'}, {silent: true}); 

// Sync 
if (myModel.hasChanged()) { 
    console.log(myModel.changedAttributes()); // {'foo':'bar', 'foobar':'barfoo'} 
    _.each(myModel.changedAttributes(), function(value, key) { 
    console.log(key+' used to be '+myModel.previous(key)+', but now is '+value); 
    } 
    myModel.save(); 
} 
+0

dường như không hoạt động với xương sống 1.1.2 – user116293

5

Tôi đang làm việc với CouchDB và Couch có thuộc tính _rev thay đổi sau mỗi lần lưu thành công. Tôi đã giải quyết được vấn đề "kể từ khi-qua-server-tiết kiệm" bằng cách đặt đoạn mã sau vào các mô hình khởi tạo chức năng:

 initialize : function() { 
     this.on('change',function(){ 
      if(this.hasChanged('_rev')) { 
       this.isSaved = true; 
      }else{ 
       this.isSaved = false; 
      } 
     },this); 
     } 
0

Tất cả các câu trả lời gợi ý lắng nghe những thay đổi (sử dụng các sự kiện) là chính xác trừ khi bạn vượt qua {im lặng: đúng} tùy chọn. Trong trường hợp đó, bạn cần ghi đè phương thức thiết lập mặc định để lưu các thuộc tính đã thay đổi và đặt lại danh sách đó sau khi gọi phương thức lưu.

Nửa đêmLời trả lời của câu trả lời là không chính xác. Nếu bạn gọi thiết lập phương pháp hai lần sau đó changedAttributes sẽ trở lại chỉ thuộc tính có thay đổi kể từ cuộc gọi thiết lập cuối cùng - đó là trong tài liệu Backbone:

changedAttributesmodel.changedAttributes([attributes])

Lấy một hash của các thuộc tính duy nhất của mô hình đã thay đổi kể từ tập cuối cùng hoặc sai nếu không có.

Trong trường hợp của tôi, tôi giải quyết vấn đề với mã này:

(function(_, Backbone) { 
    'use strict'; 

    var _set = Backbone.Model.prototype.set, 
    _save = Backbone.Model.prototype.save; 

    _.extend(Backbone.Model.prototype, { 
    set: function(key, val, options) { 
     var options = this._getOptions(key, val, options), 
     toReturn = _set.call(this, key, val, options); 
     if(!_.isUndefined(options) && options.silent && !!this.changedAttributes()) { 
     this.silentChanges = _.extend([], this.silentChanges); 
     [].push.apply(this.silentChanges, _.keys(this.changedAttributes())); 
     } 
     return toReturn; 
    }, 
    save: function(key, val, options) { 
     var options = this._getOptions(key, val, options), 
     toReturn = _save.call(this, key, val, options); 
     if(!_.isUndefined(options) && options.triggerSilents) { 
     this.triggerSilentChanges(); 
     } 
     return toReturn; 
    }, 
    unset: function(key, options) { 
     if(!_.isUndefined(options) && options.silent) { 
     this.silentChanges = _.extend([], this.silentChanges, _.keys(this.changedAttributes())); 
     } 
    }, 
    triggerSilentChanges: function() { 
     if(!_.isEmpty(this.silentChanges)) { 
     var that = this; 
     _.each(this.silentChanges, function(key) { 
      that.trigger('change:' + key); 
      that.silentChanges = _.without(that.silentChanges, key); 
     }); 
     Backbone.Model.prototype.trigger.call(this, 'change'); 
     } 
    }, 
    _getOptions: function(key, val, options) { 
     if(key == null || _.isObject(key)) { 
     return val; 
     } 
     return options; 
    } 
    }); 
})(_, Backbone); 

Nếu tôi muốn có được tất cả đã thay đổi thuộc tính tôi sử dụng tài sản silentChages bên trong mô hình. Nếu tôi muốn kích hoạt sự kiện cho tất cả các thuộc tính set/unset khi tôi lưu, tôi thêm tùy chọn 'triggerSilents: true'. Tôi cũng có thể kích hoạt tất cả sự kiện thay đổi theo cách thủ công bằng cách gọi phương thức triggerSilentChanges.

0

Chỉ để tham khảo, tôi đã thực hiện một đoạn mã nhỏ thay thế phương thức Backbone.sync mặc định.

Số liệu Backbone.sync được thay thế mà Thuộc tính đã thay đổi kể từ lần lưu cuối cùng() và nó hoạt động với cả hai mô hình và bộ sưu tập.

https://github.com/ChiefORZ/backbone.dirty-sync

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