Javascript 当视图被注入控制器时,如何从视图类中获取事件侦听器以引用控制器类中的方法?
我无法确定如何使视图中的事件侦听器引用控制器中的方法。我想在视图中分配所有侦听器,但在构造函数中这样做是吗 如何将侦听器绑定到控制器中的方法Javascript 当视图被注入控制器时,如何从视图类中获取事件侦听器以引用控制器类中的方法?,javascript,class,Javascript,Class,我无法确定如何使视图中的事件侦听器引用控制器中的方法。我想在视图中分配所有侦听器,但在构造函数中这样做是吗 如何将侦听器绑定到控制器中的方法 类模型{ 建造师(测试){ 这个。测试=测试; } } 类视图{ 构造函数(元素){ this.element=元素; 元素。addEventListener('dragenter',dragenter,false); 元素。addEventListener('drop',drop,false); } } 类控制器{ 构造函数(企鹅视图、企鹅模型){ t
类模型{
建造师(测试){
这个。测试=测试;
}
}
类视图{
构造函数(元素){
this.element=元素;
元素。addEventListener('dragenter',dragenter,false);
元素。addEventListener('drop',drop,false);
}
}
类控制器{
构造函数(企鹅视图、企鹅模型){
this.penguinView=企鹅视图;
this.penguinModel=企鹅模型;
}
排水器(e){
console.log('enter');
}
下降(e){
console.log('drop');
}
}
函数就绪(){
常量模型=新模型();
const targetElement=document.getElementById('listOfPenguins');
常量视图=新视图(targetElement);
常量控制器=新控制器(企鹅视图,企鹅模型);
功能默认值(e){
e、 预防默认值();
}
addEventListener('dragleave',preventDefault,false);
window.addEventListener('dragover',preventDefault,false);
addEventListener('drop',preventDefault,false);
}
document.addEventListener('DOMContentLoaded',ready)代码>
应用程序
也许可以朝这个方向思考
class View {
constructor(element) {
this.element = element;
}
dragEnterInit(fn) {
element.addEventListener('dragenter', fn, false);
}
dropInit(fn) {
element.addEventListener('drop', fn, false);
}
}
class Controller {
constructor(penguinView, penguinModel) {
this.penguinView = penguinView;
this.penguinModel = penguinModel;
this.penguinView.dragEnterInit(this.dragEnter.bind(this));
this.penguinView.dropInit(this.drop.bind(this));
}
dragEnter(e) {
console.log('enter');
}
drop(e) {
console.log('drop');
}
}
通常,开发人员使用事件驱动的体系结构来触发事件并附加侦听器
让我们编写一个基本EventEmitter
类:
class EventEmitter {
constructor() {
this._events = {};
}
trigger(eventName, eventData) {
var handlers = this._events[eventName];
if (handlers) {
handlers.forEach(handler => handler.call(this, eventData));
}
return this;
}
on(eventName, eventHandler) {
this._events[eventName] = this._events[eventName] || [];
this._events[eventName].push(eventHandler);
return this;
}
}
从EventEmitter
扩展视图
:
class View extends EventEmitter{
constructor(element) {
super();
this.element = element;
element.addEventListener('dragenter', (evt) => this.trigger('dragenter', evt), false);
element.addEventListener('drop', (evt) => this.trigger('drop', evt), false);
}
}
让控制器
在视图
实例上绑定事件:
class Controller {
constructor(penguinView, penguinModel) {
this.penguinView = penguinView;
this.penguinModel = penguinModel;
this.penguinView
.on('dragenter', this.dragEnter)
.on('drop', this.drop);
}
dragEnter(e) {
console.log('enter');
}
drop(e) {
console.log('drop');
}
}
谢谢你的帮助!只是有点太冗长了,我决定按照上面的建议添加事件发射器。谢谢!我成功了,但遇到了一个主要的绊脚石。我似乎无法在控制器
类的视图
中调用函数。如果我在视图中有一个名为hello()
的方法,在Controller
中有一个名为this.penguinView.hello()的方法代码>它显示未捕获类型错误:无法读取未定义的属性“hello”