Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是在纯Javascript(typescript)中实现事件驱动编程的正确方法吗?_Javascript_Model View Controller_Event Driven - Fatal编程技术网

这是在纯Javascript(typescript)中实现事件驱动编程的正确方法吗?

这是在纯Javascript(typescript)中实现事件驱动编程的正确方法吗?,javascript,model-view-controller,event-driven,Javascript,Model View Controller,Event Driven,我以的Javascript示例为基础,尝试用事件实现我自己的版本。 我用的是合成事件。 到目前为止,只执行了一个操作,即addItem 应用程序的入口点: class App { private model = new Model(); private view = new View(); public controller = new Controller(this.model, this.view); constructor() { this

我以的Javascript示例为基础,尝试用事件实现我自己的版本。 我用的是合成事件。 到目前为止,只执行了一个操作,即addItem

应用程序的入口点:

class App {
    private model = new Model();
    private view = new View();
    public controller = new Controller(this.model, this.view);

    constructor() {
        this.setListeners()
    }

    setListeners() {
        document.addEventListener(this.view.AddItemEventType, ({ detail }: CustomEvent["detail"]) => {
            this.controller.addItem(detail)
        })

    }
}

window.addEventListener('load', () => new App(), false)
控制器:

export default class Controller {
    constructor(public model: Model, public view: View) { }

    addItem(title: Item["title"]) {
        this.model.insert({
            id: generateUuid(),
            completed: false,
            title
        });
    }
}
型号:

export default class Model {
    constructor() {}

    getLocalStorage(): Item[] {
        return JSON.parse(window.localStorage.getItem("data")!) || [];
    }
    setLocalStorage(itemList: Item[]) {
        return window.localStorage.setItem("data", JSON.stringify(itemList));
    }

    insert(item: Item){
        const itemList = this.getLocalStorage();
        itemList.push(item);
        this.setLocalStorage(itemList);
    }
}
视图(这是使用
CustomEvent
的位置):

我的问题是:

  • 你看到这个代码有什么问题吗
  • 你会在生产中使用它吗
export default class View {
    public AddItemEventType = "AddItem";
    private addItemEvent = (title: string) => new CustomEvent(this.AddItemEventType, {detail: title});

    private input = document.querySelector('input')!;

    constructor() {
        this.addListeners();
    }

    addListeners() {
        this.input.addEventListener('change', ({target}: any): void => {
            const title = target.value.trim();
            if(title){
                document.dispatchEvent(this.addItemEvent(title));
            }
        })
    }
}