📅  最后修改于: 2023-12-03 15:41:35.695000             🧑  作者: Mango
Backbone.js 是一个轻量级的JavaScript框架,非常适合用于构建单页应用程序(SPA)。它采用了经典的MVC(Model-View-Controller) 架构模式,同时融入了观察者模式和事件驱动机制。这种设计使得它能够增强代码结构的可读性和可维护性,并能更好地实现前端的业务逻辑。
以下是 Backbone.js 的三个主要部分:
在 Backbone.js 中,Model代表了应用程序中的数据。每个Model可以包含一组数据以及一些业务逻辑。通常,一个Model会跟后端的某个资源或者API相关联。比如,一个Todo应用程序有一个Todo Model,代表了一个待办事项,这个Model包含了标题、描述、优先级等属性。同时,这个Model也能定义一些行为方法,比如“完成(complete)”或者“删除(delete)”一个Todo。
可以使用Backbone.Model.extend()方法来定义一个Model。如下是一个简单的Model定义示例:
var Todo = Backbone.Model.extend({
defaults: {
title: "",
completed: false
},
toggle: function() {
this.save({completed: !this.get('completed')});
}
});
上面的代码意图是定义一个Todo Model,它有一个默认的title属性和completed属性,并且一个toggle()方法,代表完成/未完成状态的切换。
一旦我们定义了一个Model,我们就可以实例化它,然后在页面中使用它了。下面是一个简单的例子,演示如何使用一个Todo Model:
var todo = new Todo({
title: "Buy Milk",
completed: false
});
console.log(todo.get('title'));
todo.toggle();
console.log(todo.get('completed'));
在上面的例子中,我们首先创建了一个新的Todo Model的实例,然后通过get()方法获取了它的属性值。接下来,我们调用了toggle()方法,该方法会将Todo Model的completed属性反转。
Backbone.js 的View负责应用程序的用户界面。它会监听Model的事件,根据它的变化来自动更新面板,并且通过给Model添加新属性来响应用户的输入。
在Backbone.js中,可以使用Backbone.View.extend()方法来创建一个视图。如下是一个例子:
var TodoView = Backbone.View.extend({
tagName: 'li',
template: _.template($('#todo-template').html()),
initialize: function () {
this.listenTo(this.model, 'change', this.render);
},
render: function () {
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
在上面的代码中,我们定义了一个TodoView视图。它包含一个tagName属性,代表HTML标签类型,这里是li。另外,它引用了一个名为todo-template的DOM元素,并将其用作HTML模板。最后,它定义了一个render()方法,用来渲染View。
一旦我们定义了一个视图,我们可以将其实例化,然后添加到页面中。下面的例子演示了如何使用一个TodoView:
var view = new TodoView({model: todo});
$('ul').append(view.render().el);
在上面的例子中,我们首先创建了一个TodoView实例,并将它传递给了一个Todo Model。接下来,我们将视图的根元素添加到了页面中的ul元素中。
Collections是Backbone.js中另一个非常有用的部分,它代表了一组相关的Model对象。
可以使用Backbone.Collection.extend()方法来定义一个集合。下面是一个例子:
var TodoList = Backbone.Collection.extend({
model: Todo,
url: '/todos',
});
在上述例子中,我们定义了一个名为TodoList的集合,它由Todo Models组成,并且有一个URL属性,代表了从服务器获取数据的API路径。
一旦我们定义了一个集合,我们可以使用它来获取某些Model的子集,或者对这些Model进行操作。下面是一个简单的集合使用例子:
var todos = new TodoList();
todos.fetch();
console.log(todos.length); // 输出所有Todo的数量
todos.each(function (todo) {
console.log(todo.get('title')); // 输出所有Todo的标题
});
var done = todos.where({completed: true}); // 获取所有完成的Todo
console.log(done.length);
在上面的例子中,我们首先创建了一个新的TodoList集合实例,并使用fetch()方法从服务器获取数据。接下来,我们使用了each()方法来遍历所有的Todo Model,输出它们的标题。最后,我们调用了where()方法来获取已经完成的Todo集合(done)。