Backbone:将模型移动到另一个Collection

时间:2015-10-11 18:17:02

标签: javascript backbone.js

这是我第一次使用骨干,所以我对一切都很困惑。我正在尝试做一个待办事项列表。一旦我点击todo上的“完成”,我希望它附加到“已完成”列表。

我一直在关注这个教程,我试图复制代码(我试图创建一个新的completedTodo视图和类似的东西),我试图做点击“完成”它会删除$ el,我会添加到completedTodos。我认为这里的问题即使它被添加了,它也没有做任何事情。

  done: function() {
var completed = new CompletedTodo({
  completedTask: this.$('.task').html(),
  completedPriority: this.$('.priority').html()
});
completedTodos.add(completed);
this.model.destroy();

},

我在那里放了一个调试器,看看它是否真的添加到了集合中,当我完成了CompleteTodos.toJSON();时,它确实给了我刚刚添加的新东西。

但是,它不会附加到我的收藏列表中。

这是我的整个脚本文件,以防我说错了。

    var Todo = Backbone.Model.extend({
  defaults: {
    task: '',
    priority: ''
  }
});

var CompletedTodo = Backbone.Model.extend({
  defaults: {
    completedTask: '',
    completedPriority: ''
  }
});

var Todos = Backbone.Collection.extend({});

var todos = new Todos();

var CompletedTodos = Backbone.Collection.extend({});

var completedTodos = new CompletedTodos();

//Backbone view for one todo
var TodoView = Backbone.View.extend({
  model: new Todo(),
  tagName: 'tr',
  initialize: function() {
    this.template = _.template($('.todos-list-template').html());
  },
  events: {
    'click .finished-todo': 'done',
    'click .delete-todo' : 'delete'
  },
  done: function() {
    var completed = new CompletedTodo({
      completedTask: this.$('.task').html(),
      completedPriority: this.$('.priority').html()
    });
    completedTodos.add(completed);
    this.model.destroy();
  },
  delete: function() {
    this.model.destroy();
  },
  render: function() {
    this.$el.html(this.template(this.model.toJSON()));
    return this;
  }
});

//Backbone view for all todos
var TodosView = Backbone.View.extend({
  model: todos,
  el: $('.todos-list'), 
  initialize: function() {
    this.model.on('add', this.render, this);
    this.model.on('remove', this.render, this);
  },
  render: function() {
    var self = this;
    this.$el.html('');
    _.each(this.model.toArray(), function(todo) {
      self.$el.append((new TodoView({model: todo})).render().$el);
    });
    return this;
  }
});

//View for one Completed Todo
var CompletedTodoView = Backbone.View.extend({
  model: new CompletedTodo(),
  tagName: 'tr',
  initialize: function() {
    this.template = _.template($('.completed-todos-template').html());
  },
  render: function() {
    this.$el.html(this.template(this.model.toJSON()));
    return this;
  }
});

//View for all Completed Todos
var CompletedTodosView = Backbone.View.extend({
  model: completedTodos,
  el: $('.completed-todos-list'), 
  initialize: function() {
    this.model.on('add', this.render, this);
  },
  render: function() {
    var self = this;
    this.$el.html('');
    _.each(this.model.toArray(), function(completedTodo) {
      self.$el.append((new CompletedTodoView({model: completedTodo})).render().$el);
    });
    return this;
  }
});

var todosView = new TodosView();

$(document).ready(function() {
  $('.add-todo').on('click', function() {
    var todo = new Todo({
      task: $('.task-input').val(),
      priority: $('.priority-input').val()
    });
    $('.task-input').val('');
    $('.priority-input').val('');
    todos.add(todo);
  });
});

在此之后,我还必须弄清楚如何使用Parse使其持久化到数据库。我想我首先要在骨干网上工作,然后尝试放入数据库。我也想使用node / express,那会有帮助吗?我几乎是一个Ruby on Rails的人,所以我真的不知道这些javascript框架类型的东西。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

好的,

这只是因为我没有初始化视图。

var completedTodosView = new CompletedTodosView();

这解决了它。