todomvc vanilla javascript中的多个待办事项列表?

时间:2018-06-09 13:57:52

标签: javascript todomvc

我正在使用一个很好的todomvc项目的Vanilla JS实现的应用程序。应用程序使用vanilla JS以MVC方式构建。我正在尝试实现一种方法来获取MULTIPLE待办事项列表(从localstorage获取所有列表,然后单击列表并让它显示所有待办事项)

// Make a new TaskList
taskButton.addEventListener('click', function() {
    // 1. Make the new todo list
    let newList = newTaskList.value;
    var todo = new Todo(newList);
    // 2. Set the view and retrieve all the todos
});



// Get all key values for tasklists, render and make links to different todo collections
function getTaskList() {
    var i, renderTask;

    renderTask = '';

    for (i = 0; i < localStorage.length; i++)   {
        renderTask += "<li><a class='tasklink' href='#' value='" + localStorage.key(i) + "'>" + localStorage.key(i) + "</a></li>";
    }
    return renderTask;
}

var taskList = getTaskList();

document.getElementById('tasklist').innerHTML = taskList;


// querySelectorAll produces a DOM nodelist not an array
var matches = document.querySelectorAll('a.tasklink');

// This is a node list, not an array. This is not the best way to do this
// would be mor elegant to use a forEach on the matches nodelist probably
for (var i=0; i < matches.length; i++) {
    matches[i].addEventListener('click', function(e) {
        var taskListValue = e.target.innerHTML;
        // create a new todo object based on click selection
        var todo = new Todo(taskListValue);
        todo.controller.setView(document.location.hash);
    });
}

我编写了部分代码来执行此操作(需要重构)它基本上获取了todomvc中的所有localstorage列表(_dbname)。单击其中一个时,您将创建一个新的Todo列表。

我很确定我有绑定问题。因为当我执行下面的代码并在列表之间切换时,它会在它到达控制器时起作用:

 function Controller(model, view) {

    var self = this;
    self.model = model;
    self.view = view;

    console.log('self:');
    console.log(self);
    console.log('self.model:');
    console.log(self.model);

    self.view.bind('newTodo', function (title) {
        self.addItem(title);
    });

console.log的输出是正确的...模型在对象之间完美地改变(多个待办事项列表)......但是当我开始向待办事项列表添加新项目时......说...我有两个列表,“艺术”和“收件箱”...如果我切换到“艺术”一个并添加一个新的待办事项......它只会将其添加到“收件箱”一个并显示艺术和收件箱来自收件箱localstorage的todos(将所有内容放入收件箱localstorage中)。

因此,在添加待办事项的方法时调用此函数:

 self.view.bind('newTodo', function (title) {
        self.addItem(title);
    });

然后我假设它绑定了视图函数,然后在新todo上按Enter键时执行回调(self.addItem(title))...此方法在控制器中:

 Controller.prototype.addItem = function (title) {
    var self = this;

    if (title.trim() === '') {
        return;
    }

    self.model.create(title, function () {
        self.view.render('clearNewTodo');
        self._filter(true);
    });
};

所以,self.model应该是正确的...它被更改并传递给控制器​​...但是当它转到这个方法时... BOOM模型仍然是收件箱,而不是艺术。所以,我最好的猜测是存在绑定问题,我的更改的模型名称没有转移到方法中。

这是一个绑定问题不是吗?

由于我对JS有点新手,我脑子里的一些东西告诉我,我正在以错误的方式接近这一点,而不是利用代码结构的MVC功能,我注意到了Todo( )对象....它已经有一个名字,可以在这里传递,如在Todo(名称)...所以有人已经建立了一个方法,有一个以上的列表......

我遇到的问题是如何从UI创建新列表并让它们切换并显示待办事项。我知道有些人会说....你应该使用一个框架。在React或其他东西中构建它...但对我来说,在继续尝试掌握框架之前,深刻理解vanilla JS似乎是至关重要的。

任何帮助都会很棒!

0 个答案:

没有答案