2011-12-20 23 views
6

Khi thay đổi "chartModel" của tôi, tôi muốn cập nhật "globalModel".Làm cho mô hình Backbone.js thay đổi "một phần" im lặng?

chartModel.bind("change", updateGlobalModel); 

updateGlobalModel(){ 
    globalModel.set(obj) 
} 

Và ngược lại, tôi muốn biểu đồ của tôi cập nhật khi globalModel thay đổi.

globalModel.bind("change", updateChartModel); 

updateChartModel(){ 
    chartModel.set(obj) 
} 

Điều này dẫn đến vòng phản hồi khi đặt globalModel. Tôi có thể ngăn chặn điều này bằng cách đặt {im lặng: true}.

Nhưng ở đây có vấn đề. Tôi có một mẫu mà phụ thuộc vào sự kiện thay đổi:

globalModel.bind("change", updateOtherModel); 

Làm thế nào tôi có thể cảnh báo mô hình này của sự thay đổi nhưng không phải là cựu một (để tránh các vòng lặp phản hồi)?

UPDATE:
Còn bây giờ, tôi quyết định tạo ra một ID cụ thể cho mỗi cuộc gọi thiết lập:

set : function(attrs, options) { 
     if(!("setID" in attrs)){ 
      attrs.setID = myApp.utils.uniqueID(); //newDate.getTime(); 
     } 
     Backbone.Model.prototype.set.call(this, attrs, options); 
    }, 

Bằng cách này, tôi luôn có thể tạo ra một "setID" thuộc tính từ bất cứ nơi nào trong tôi ứng dụng. Nếu setID vẫn giống nhau khi tìm nạp thứ gì đó từ mô hình, tôi biết có thể có nguy cơ cho vòng lặp phản hồi.

Trả lời

0

Kiến thức của tôi bị giới hạn, vì vậy có lẽ tôi không nên trả lời, nhưng tôi sẽ cố gắng chuyển tham chiếu đến biểu đồModel khi nó được tạo liên quan đến mô hình "khác" mà bạn muốn cập nhật. Sau đó kích hoạt một sự kiện trên updateChartModel() và đảm bảo mô hình "khác" của bạn bị ràng buộc trên sự kiện đó.

Câu hỏi tôi có là: đối tượng im lặng có tắt tiếng tất cả các sự kiện không? Hoặc chỉ cần mô hình hóa những người có liên quan? Điều này rõ ràng sẽ không hoạt động nếu tất cả các sự kiện bị tắt tiếng.

+0

Cảm ơn đề xuất của bạn - Tôi sẽ dùng thử nếu giải pháp thay thế của tôi không thành công (tôi đã cập nhật câu hỏi của mình). – dani

1

Tốt hơn không bao giờ ..

Cách dễ nhất để thực hiện việc này là sử dụng cờ. Ví dụ, khi thiết lập một cái gì đó trong globalModel, bạn cũng có thể thay đổi một thuộc tính trên mô hình để chỉ ra rằng bạn đã thay đổi một cái gì đó. Sau đó, bạn có thể xác minh giá trị của cờ này trong updateChartModel. Ví dụ:

biểu đồModel.bind ("change", updateGlobalModel);

function updateGlobalModel() { 
    if (!flag) { 
     globalModel.set(obj); 
     flag = true; 
    } 
} 

Có lẽ rất giống với những gì bạn đã làm với setID của mình. Ngoài ra, dấu gạch dưới có chức năng uniqueId được tích hợp sẵn.

Một thứ khác mà bạn có thể làm, sạch hơn nhiều, là chuyển tùy chọn với các cuộc gọi của bạn.

chartModel.set(obj, { notify : false }); 

Có, bạn có thể chuyển bất kỳ tùy chọn nào bạn muốn, bạn không chỉ giới hạn ở { silent : true }. Xem this discussion on github để biết thêm. Sau đó, bạn kiểm tra sự tồn tại của thuộc tính này, nơi bạn xử lý các sự kiện thay đổi như vậy:

function updateGlobalModel(model, options){ 
    // explicitly check for false since it will otherwise be undefined and falsy 
    // you could reverse it.. but I find this simpler 
    if (options.notify !== false) { 
     globalModel.set(obj) 
    } 
} 

và trong mô hình thứ ba (và các mô hình khác), bạn có thể bỏ qua kiểm tra này.

Tùy chọn cuối cùng là tất nhiên để xem thiết kế của bạn. Nếu hai mô hình này có liên quan chặt chẽ đến mức chúng phải được giữ đồng bộ với nhau, có thể là hợp lý để hợp nhất chức năng của chúng. Ngoài ra, bạn có thể tách chức năng chung ra. Tất cả điều này phụ thuộc rất nhiều vào tình hình cụ thể của bạn.

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