Trong khi câu trả lời khác thực hiện những gì bạn cần, họ không làm việc trong (khả năng mở rộng) cách hiệu quả nhất , bởi vì cuối cùng họ không tách rời đối tượng xem (this.chart
) khỏi logic của chế độ xem đó (fireEvent()
). Trong các ứng dụng MVC, các "quyết định" xem này nằm trong bộ điều khiển . Bộ điều khiển "điều khiển" lượt xem và phải chứa tất cả các API mà chế độ xem có thể truy cập.
Trong ví dụ của bạn, this
là bộ điều khiển và điều đó tốt (điều đó có nghĩa là bạn đang thêm người nghe vào đúng nơi). Tất cả các bạn thực sự cần phải làm là gắn kết xử lý với phạm vi điều rằng nên làm như "xử lý" - trong trường hợp của bạn: this
:
// `this` is the controller of `chart`
this.chart.addEventListener('create', function() {
this.fireEvent('created');
}.bind(this));
gì câu trả lời khác trên trang này đã làm là làm cho nó để chế độ xem của bạn trở thành bộ điều khiển riêng, nhưng chỉ khi xử lý các sự kiện 'tạo', bằng cách gán một tham chiếu tạm thời cho "bộ điều khiển" sử dụng var self = this
. Một lần nữa, điều này hoạt động tốt, nhưng nó không hoạt động tốt ở quy mô trong các ứng dụng hướng sự kiện, và nó không thực sự có ý nghĩa nếu bạn có rất nhiều sự kiện để xử lý.
.bind()
là triển khai ECMAScript 5. Nếu cần thiết để làm việc trong các trình duyệt cũ hơn, một phương pháp tốt để làm như vậy được mô tả ở đây (sử dụng functions
và .call()
): https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind
Tôi thích 'var self = this;'. Tạo một hàm và sau đó thực thi nó trong khi truyền 'this' như tham số có vẻ hơi quá mức - mã hơi dài hơn nữa ;-) –
@Andy: Vâng, tôi cũng thường làm điều đó khi mã tồn tại trong ngữ cảnh thực thi nhỏ. Tuy nhiên, ở trên là cách tiếp cận tiêu chuẩn hoạt động trong nhiều kịch bản khác nhau.Phạm vi của định danh 'self' chỉ giới hạn trong việc đóng, không có nguy hiểm là mã tiếp theo có thể sửa đổi giá trị chứa trong nó trước khi sự kiện cháy. Điều này không đúng với phương thức 'var self = this;'. – AnthonyWJones