Hủy hoặc xóa chế độ xem trong Backbone.js


83

Tôi hiện đang cố gắng triển khai phương pháp hủy / xóa cho các chế độ xem nhưng tôi không thể tìm được một giải pháp chung nào hoạt động cho tất cả các chế độ xem của mình.

Tôi đã hy vọng sẽ có một sự kiện để gắn vào bộ điều khiển, để khi một yêu cầu mới đến, nó sẽ phá hủy các chế độ xem trước đó sau đó tải các chế độ xem mới.

Có cách nào để làm điều này mà không cần phải xây dựng hàm loại bỏ cho mỗi chế độ xem không?


Bạn có thể cho một ví dụ về hệ sinh thái quan điểm của bạn là gì không? Câu hỏi của bạn khiến tôi nghĩ rằng có nhiều lượt xem trên trang cùng một lúc. Tôi không thể hình dung được những gì bạn đang cố gắng làm và do đó không thể đưa ra câu trả lời có thể là những gì bạn cần.
Bill Eisenhauer

1
một số mẫu khác từ những bài đăng tuyệt vời này: lostechies.com/derickbailey/2011/09/15/… coenraets.org/blog/2012/01/…
daedelus_j

Câu trả lời:


47

Nếu không biết tất cả thông tin ... Bạn có thể liên kết trình kích hoạt đặt lại với mô hình hoặc bộ điều khiển của mình:

this.bind("reset", this.updateView);

và khi bạn muốn đặt lại các chế độ xem, hãy kích hoạt đặt lại.

Đối với cuộc gọi lại của bạn, hãy làm điều gì đó như:

updateView: function() {
  view.remove();
  view.render();
};

5
Tôi không nghĩ điều này là đúng. Chức năng loại bỏ của Chế độ xem chỉ xóa phần tử của chế độ xem đó khỏi DOM ( xem tại đây ). Tôi nghĩ anh chàng này muốn xóa hoàn toàn đối tượng xem.
Nutri Nutritiontim

2
this.remove () kết thúc bằng lệnh remove () của jquery, cũng loại bỏ dữ liệu và sự kiện ... Tuy nhiên, tôi nghĩ bạn cũng phải gọi this.undelegateEvents để hủy liên kết khỏi các sự kiện khác, như sự kiện tùy chỉnh hoặc thay đổi đối với mô hình ..
opensas

21
this.remove()cuộc gọi this.stopListening()this.$el.remove(). Đầu tiên loại bỏ tất cả các trình nghe sự kiện được thêm vào bằng cách sử dụng this.listenTo(...). Thứ hai loại bỏ tất cả các trình nghe sự kiện thêm bằng jQuery. Giữa cả hai, bạn nên được bảo vệ trừ khi bạn sử dụng một số phương tiện khác để thêm trình nghe sự kiện. Vì vậy, câu trả lời này là chính xác và nhận được +1 từ tôi.
chowey

162

Tôi phải hoàn toàn chắc chắn rằng chế độ xem không chỉ bị xóa khỏi DOM mà còn hoàn toàn không bị ràng buộc khỏi các sự kiện.

destroy_view: function() {

    // COMPLETELY UNBIND THE VIEW
    this.undelegateEvents();

    this.$el.removeData().unbind(); 

    // Remove view from DOM
    this.remove();  
    Backbone.View.prototype.remove.call(this);

}

Tôi thấy có vẻ quá mức cần thiết, nhưng các cách tiếp cận khác không hoàn toàn làm được điều đó.


10
đối với những gì tôi đã thấy, this.remove () nên gọi jQuery's remove, sẽ xóa phần tử khỏi DOM nhưng cũng xóa dữ liệu và sự kiện gắn với nó. Vì vậy, tôi đoán rằng lệnh gọi undelegateEvents và removeData không cần thiết ... Tôi có đúng không?
opensas

1
@opensas Các sự kiện vẫn tồn tại sau this.remove () mặc dù phần tử đã bị xóa khỏi DOM. this.undelegateEvents () là cần thiết để hủy liên kết tất cả các sự kiện. Như tôi đã nói, nó có vẻ như quá mức cần thiết, nhưng nó đã làm được điều đó.
sdailey 13/09/12

3
Tôi thích nó. Cho dù bạn nên sử dụng this.$elthay vì $(this.el);)
mreq

3
1 cho một câu trả lời tốt cho vấn đề của tôi, 1 để viết câu trả lời đầu tiên của bạn :)
1nfiniti

1
Chế độ xem của tôi không được hiển thị lại khi phá hủy và tạo lại nó. Có phải vì this.remove()?
Raeesaa

20

Tôi biết tôi đến muộn bữa tiệc, nhưng hy vọng điều này sẽ hữu ích cho người khác. Nếu bạn đang sử dụng backbone v0.9.9 +, bạn có thể sử dụng listenTostopListening

initialize: function () {
    this.listenTo(this.model, 'change', this.render);
    this.listenTo(this.model, 'destroy', this.remove);
}

stopListeningđược gọi tự động bởi remove. Bạn có thể đọc thêm ở đâyđây


8

Đây là những gì tôi đã được sử dụng. Chưa thấy có vấn đề gì.

destroy: function(){
  this.remove();
  this.unbind();
}

4

Theo tài liệu Backbone hiện tại ...

view.remove ()

Xóa một chế độ xem và el của nó khỏi DOM và gọi stopListening để xóa mọi sự kiện ràng buộc mà chế độ xem đó có listeningTo'd.


0

Tôi nghĩ rằng điều này sẽ làm việc

destroyView : function () {
    this.$el.remove();
}

Phải giết người nghe cũng có this.stopListening()và sau đó return thischo biện pháp tốt
Brandon

0

Bạn có thể sử dụng cách để giải quyết vấn đề!

initialize:function(){
    this.trigger('remove-compnents-cart');
    var _this = this;
    Backbone.View.prototype.on('remove-compnents-cart',function(){
        //Backbone.View.prototype.remove;
        Backbone.View.prototype.off();
        _this.undelegateEvents();
    })
}

Một cách khác : Tạo một biến toàn cục, như sau:_global.routerList

initialize:function(){
    this.routerName = 'home';
    _global.routerList.push(this);
}
/*remove it in memory*/
for (var i=0;i<_global.routerList.length;i++){
    Backbone.View.prototype.remove.call(_global.routerList[i]);
}

Cách tiếp cận đầu tiên làm việc cho tôi, tôi chạy vào một vấn đề tương tự với quan điểm bóng mờ và các sự kiện bị bắn nhiều lần mỗi khi xem đã được tái tạo khi bạn đã gửi mẫu đơn
ONYX
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.