gpt4 book ai didi

javascript - 带有嵌套待办事项的 Backbone.js Todo 示例

转载 作者:行者123 更新时间:2023-11-29 20:08:02 24 4
gpt4 key购买 nike

我想扩展 backbone todo example ( code ) 每个待办事项上都有嵌套的待办事项。

我必须使用 Backbone 关系型还是有更好或更简单的解决方案?

Edit1:我尝试使用 Backbone 关系来让它工作,但我在应用程序 View 中的“createOnEnter”函数上遇到错误:“Uncaught TypeError: Object function (obj) { return new wrapper(obj); } has没有方法'isObject'”。这是代码:

$(function(){

// ------------------- Todo Model ------------------

var Todo = Backbone.RelationalModel.extend({

relations: [{
type: Backbone.HasMany,
key: "children",
relatedModel: "Todo",
collectionType: "TodoList",
reverseRelation: {
key: "parent",
includeInJSON: "id"
}
}],

initialize: function() {
console.log("MODEL: initialize()");
if (!this.get("order") && this.get ("parent")) {
this.set( {order: this.get("parent").nextChildIndex() });
}
},

defaults: function() {
console.log("MODEL: defaults()");
return {
done: false,
content: "default content" };
},

nextChildIndex: function() {
var children = this.get( 'children' );
return children && children.length || 0;
},

clear: function() {
this.destroy();
}
});

//----------------待办事项集----------------

var TodoList = Backbone.Collection.extend({
model: Todo,
// Save all of the todo items under the `"todos"` namespace.
localStorage: new Store("todos-backbone"),

done: function() {
return this.filter(function(todo){ return todo.get('done'); });
},

});
var Todos = new TodoList;

//------------------ Todo View ------------------

var TodoView = Backbone.View.extend({
tagName: "li",

template: _.template($('#item-template').html()),

events: {
"keypress input.add-child": "addChild",
"click .check" : "toggleDone",
"dblclick label.todo-content" : "edit",
"click span.todo-destroy" : "clear",
"keypress .todo-input" : "updateOnEnter",
"blur .todo-input" : "close"
},

initialize: function() {
console.log("TODOVIEW: initialize()");
this.model.bind('change', this.render);
this.model.bind('destroy', this.remove);

this.model.bind("update:children", this.renderChild);
this.model.bind("add:children", this.renderChild);

this.el = $( this.el );
this.childViews = {};
},

render: function() {
console.log("TODOVIEW: render()");
$(this.el).html(this.template(this.model.toJSON()));
this.setText();
this.input = this.$('.todo-input');

this.el.append("<ul>", {"class": "children"}).append("<input>", { type: "text", "class": "add-child" });

_.each(this.get("children"), function(child) {
this.renderChild(child);
}, this);
return this;
},

addChild: function(text) {
console.log("TODOVIEW: addChild()");
if (e.keyCode == 13){
var text = this.el.find("input.add-child").text();
var child = new Todo( { parent: this.model, text: text});
}
},

renderChild: function(model){
console.log("TODOVIEW: renderChild()");
var childView = new TodoView({ model: model});
this.childViews[model.cid] = childView;
this.el.find("ul.children").append(childView.render());
},

// Remove the item, destroy the model.
clear: function() {
console.log("TODOVIEW: clear()");
this.model.set({parent: null});
this.model.destroy();
//this.model.clear();
}
});

//---------------- 应用程序 ------------------------

var AppView = Backbone.View.extend({
el: $("#todoapp"),

statsTemplate: _.template($('#stats-template').html()),

events: {
"keypress #new-todo": "createOnEnter",
"keyup #new-todo": "showTooltip",
"click .todo-clear a": "clearCompleted",
"click .mark-all-done": "toggleAllComplete"
},

initialize: function() {
console.log("APPVIEW: initialize()");
_.bindAll(this, 'addOne', 'addAll', 'render', 'toggleAllComplete');

this.input = this.$("#new-todo");

Todos.bind('add', this.addOne);
Todos.bind('reset', this.addAll);
Todos.bind('all', this.render);

Todos.fetch();
},

render: function() {

},

addOne: function(todo) {
var view = new TodoView({model: todo});
this.$("#todo-list").append(view.render().el);
},

addAll: function() {
Todos.each(this.addOne);
},

// Generate the attributes for a new Todo item.
newAttributes: function() {
return {
content: this.input.val(),
order: Todos.nextOrder(),
done: false
};
},

createOnEnter: function(e) {
console.log("APPVIEW: createOnEnter()");
if (e.keyCode != 13) return;
Todos.create( this.newAttributes());
this.input.val('');
},
});
var App = new AppView;
});

最佳答案

在这种情况下,我被分配了一个待办事项集合到新的类别模型属性

喜欢:

var todo = Backbone.Model.extend({

defaults:function(){
return {description:"No item description",done:false };
},
...............
...............
});

var todo_collection = Backbone.Collection.extend({
model: todo,
..............
..............
});

var Category = Backbone.Model.extend({
initialize: function(){
this.toDoCollection = new todo_collection();
}
});

如果您需要更多引用,请参阅我在 github 上的示例:todo list with nested items使用 BACKBONE JS

关于javascript - 带有嵌套待办事项的 Backbone.js Todo 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11293662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com