2012-02-19 37 views
17

Tôi muốn tìm cách để tăng backbone.js "sự kiện" mà không có thứ gì đó thay đổi trong mô hình hoặc trong dom.Tăng sự kiện Backbone.js Xem

Ví dụ: tôi đang tải SDK Facebook không đồng bộ. Tôi đã đăng ký sự kiện auth.login và muốn gửi thư đến chế độ xem của tôi rằng người dùng đã đăng nhập để có thể tự hiển thị lại chính xác.

Quan điểm của tôi trông giống như sau:

window.CreateItemView = Backbone.View.extend({ 
    el: $('#content'), 
    initialize: function() { 
    this.render(); 
    }, 
    render: function() { 
    // do something 
    return this; 
    }, 
    setSignedRequest: function(signedRequest) { 
    //do something with signedRequest 
    } 
}); 

Trong mã facebook của tôi, tôi làm điều này:

FB.Event.subscribe('auth.login', function(response){ 
    if (response.status === 'connected') { 
     var uid = response.authResponse.userID; 
     var accessToken = response.authResponse.accessToken; 
     window.signedRequest = response.authResponse.signedRequest; 

     if (window.view && window.view.setSignedRequest) { 
      window.view.setSignedRequest(window.signedRequest); 
     } 
    } 
    }); 

Tuy nhiên, trong khi window.view tồn tại, nó có thể không nhìn thấy phương pháp setSignedRequest. Tôi đã đảm bảo rằng các tập lệnh của tôi đang tải đúng thứ tự. Kỳ lạ tôi có cùng mã này trên một trang khác mặc dù một đối tượng View khác nhau và nó hoạt động tốt. Tôi đã không thấy bất kỳ sự khác biệt nào có thể giải thích cho điều này.

Một giải pháp tốt hơn là nâng cao một số loại sự kiện và có chế độ xem lắng nghe. Tuy nhiên, tôi không muốn sử dụng sự kiện thay đổi trên mô hình vì signedRequest không phải là thuộc tính của mô hình. Có cách nào tốt hơn để hoàn thành việc này không?

+2

Vâng, có phương thức '.trigger()'. Bạn có thể làm cho chế độ xem của bạn nghe một sự kiện tùy chỉnh mà bạn sẽ kích hoạt sau này ... –

Trả lời

28

Backbone.View được mở rộng với Backbone.Events có nghĩa là bạn có thể dễ dàng kích hoạt sự kiện tùy chỉnh và thông qua bất kỳ dữ liệu bạn muốn

var View = Backbone.View.extend({ 

    initialize: function() { 

     this.on('customEvent', this.doSomething, this); 
    } 

    doSomething: function(someData) { 

     // this! 
    } 
}); 

var view = new View(); 

view.trigger('customEvent', "someDataHere"); 

mặc dù tôi không biết lý do tại sao bạn không thể nhìn thấy các phương pháp trên xem - nó nên công việc - Bạn có chắc chắn 100% bạn đang khởi tạo chế độ xem chính xác không? và rằng window.view là bản sao của CreateItemView?

10

Nếu bạn muốn làm điều đó bên ngoài mô hình của bạn và đăng ký sự kiện trên quan điểm của bạn, bạn có thể làm như sau:

var SomeObject = {...}; 
_.extend(SomeObject, Backbone.Events); 

Sau đó, bạn có thể đăng ký các sự kiện trên SomeObject

SomeObject.on('myevent', someFunc, this); 

hoặc kích hoạt sự kiện

SomeObject.trigger('myevent', data); 
Các vấn đề liên quan