2011-10-12 26 views
18

Tôi có một lớp cơ sở cho tất cả các chế độ xem và sau đó trong mỗi phần của ứng dụng, như tiểu sử, tôi cũng có một lớp cơ sở. Bằng cách đó, các mẫu và thuộc tính được chia sẻ có thể được sử dụng trong suốt ứng dụng của tôi ở nhiều cấp độ.Tự động mở rộng sự kiện từ chế độ xem cơ sở

Tôi biết rằng nếu bạn tạo thuộc tính sự kiện trong khung nhìn Backbone một hàm thay vì một đối tượng theo nghĩa đen, nó sẽ được khởi tạo cho bạn, tôi không chắc chắn làm thế nào để sử dụng điều này để lợi thế của tôi. Câu hỏi của tôi là, cách tốt nhất để tự động mở rộng các sự kiện được tạo trong chế độ xem cơ sở là gì.

Tôi biết một khả năng mà tôi, khi khởi tạo chế độ xem, tìm lớp sự kiện cơ sở và mở rộng sự kiện hiện tại của tôi, nhưng có vẻ như một chút hacky và tôi sẽ phải sao chép mã này trên mỗi chế độ xem. Nếu bạn biết cách tốt hơn, hãy chia sẻ.

Cảm ơn.

+0

Bạn có thể xem các bài đăng/liên kết này (có thể trùng lặp): http://stackoverflow.com/questions/6257405/backbone -js-view-inheritence-this-resolution-in-parent Khác: http://stackoverflow.com/questions/6968487/sub-class-a-backbone-view-sub-class-retain-events Trang web bên ngoài: http: //kalimotxocoding.blogspot.com/2011/03/playing-with-backbonejs-views.html – PhD

+0

Xin chào Nupal, phản hồi rất hợp lệ và cảm ơn bạn đã kiểm tra tốt hơn sau đó tôi đã làm. Hai liên kết stackoverflow mà bạn đã đăng có một câu trả lời tốt, mỗi câu trả lời khác với câu trả lời được cung cấp bên dưới. Tôi sẽ thêm cả hai ở đó và làm cho điều này là nguồn dứt khoát cho câu hỏi cụ thể này (các câu hỏi khác là rộng hơn). Ngoài ra, mục nhập blog kalimotxocoding.blogspot.com chỉ đơn giản là kinh khủng, đòi hỏi phải hack lõi backbone.js và không thực sự giải quyết bất cứ điều gì. Tôi đánh giá cao ý kiến ​​của bạn. –

Trả lời

35
var ParentView = Backbone.View.extend({ 
    'events': { 
     'click .parent-something': "onParentSomethingClick" 
    } 
}); 

var ChildView = ParentView.extend({ 
    'events': _.extend({ 
     'click .something': 'onSomethingClick', 
    }, ParentView.prototype.events) 
}); 

Nó không làm gì cả, nhưng đó là cách đơn giản nhất mà tôi đã thấy cho đến nay.
Tôi cũng đã tạo ra một ý chính theo cách khác mà tôi đã sử dụng: https://gist.github.com/1271041

+1

Chức năng "cha mẹ" bạn cung cấp qua liên kết github thật tuyệt vời. Tôi chắc chắn sẽ thay thế việc triển khai _super của tôi với bạn. Cảm ơn!! – threejeez

+2

Bạn không muốn truyền vật thể của mình vào _.extend() theo cách khác? tức là Clone sau đó ghi đè lên các sự kiện của siêu lớp với các sự kiện mới? Bằng cách đó bạn có thể ghi đè lên chức năng siêu với chức năng con, một cách tiếp cận quen thuộc hơn để thừa kế. – WildService

6

Đây là cách tôi mở rộng các sự kiện quan điểm của cha mẹ theo quan điểm của con tôi:

var ParentView = Backbone.View.extend({ 

     events: { 
      'click .link': 'onLinkClick' 
     } 
}); 

var ChildView = ParentView.extend({ 

     events: function(){ 
      return _.extend({ 
       'click .something': 'onSomethingClick', 
      }, this.constructor.__super__.events); 
     } 
}); 

Lưu ý: đây chỉ hoạt động như của Backbone 0.5.3. Trước phiên bản đó, bạn không thể xác định sự kiện là một hàm.

+0

Cảm ơn JohnnyO. Tôi đã nghe nói về '__proto__' không chuẩn nhưng phổ biến nhưng chưa bao giờ nghe nói về' __super__' trong JavaScript. Đây có phải là sự bổ sung của lõi Backbone hay đây là một điều mới trong các trình duyệt hiện đại? –

+1

__super__ được thêm vào bởi lõi Backbone và nó ánh xạ tới nguyên mẫu của lớp kế thừa. –

+0

Rockin '. Cảm ơn JohnnyO. –

2

Tôi tin câu trả lời của JohnnyO là tốt nhất. Tuy nhiên tôi đã gặp hai cách khác để thực hiện nó và tôi sẽ dán chúng vào đây.

Thật đáng tiếc là không có giải pháp "tự động" không yêu cầu mã viết tay bổ sung trong mỗi chế độ xem mới, nhưng nó là gì.

ChildView = ParentView.extend({ 
    name: 'ChildView', 
    events: { 
    }, 
    constructor: function(){ 
     this.events = _.extend({}, ParentView.prototype.events, this.events); 
     console.debug(this.events); 
     ParentView.prototype.constructor.apply(this, arguments); 
    }, 
    someFunc: function(){ 
     console.debug('someFunc; this.name=%s', this.name); 
    } 
}); 

By Paul - backbone.js view inheritence. `this` resolution in parent

Tôi không biết bạn có thể cung cấp một phương thức khởi tạo trong Backbone.view.extend của bạn. Tốt để biết.

var GenericView = Backbone.View.extend({ 

    genericEvents: { 'click .close': 'close' }, 

    close: function() { console.log('closing view...'); } 

}); 

var ImplView = GenericView.extend({ 

    events: { 'click .submit': 'submit' }, 

    initialize: function(options) { 
    // done like this so that genericEvents don't overwrite any events 
    // we've defined here (in case they share the same key) 
    this.events = _.extend(this.genericEvents, this.events); 
    this.delegateEvents() 
    } 
}); 

By rulfzid - Sub Class a Backbone.View Sub Class & retain events

tôi đã mường tượng (và từ chối) phương pháp này nhưng điều này có xoắn thêm gọi cơ sở sự kiện gì đó của bạn khác để "genericEvents không ghi đè lên bất kỳ sự kiện" như tác giả nói. Trừ khi anh ta đang nói về một số sự kiện của cả hai sự kiện bạn đang đi vào bên trong của cả hai sự kiện, tôi không chắc anh ấy đang nói về cái gì, tôi chỉ sử dụng proto hoặc nguyên mẫu để tham khảo các sự kiện của cha mẹ. Nhưng một lần nữa, tốt để biết.

+1

Bạn có thể nội tuyến '_.extend ({}, ParentView.prototype.events, {'click': 'close'})' ngay bên trong định nghĩa của ChildView. Không cần cho các nhà xây dựng sau đó. –

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