Backbone.js 中使用 Model

前面几篇 Backbone.js 的例子中有使用到 template, 及数据的填充,其实这已经很接近 Model 了。现在来学习怎么创建自己的 Model 类,并简单的使用。Backbone.js 中 Model 会涉及到很多的概念,如 Model 的初始化,默认值,属性的读写,属性值改变的监听,数据渲染,校验,以及与服务端的数据同步等。

本文不打算讲前面大部分的内容,最初思考的一个脉络是怎么把 Model 引入进来,所以线索会是 建立 Model 类 -> 初始化 Model 实例 -> 设置值 -> 渲染到页面,其余 Model 特性分别再深入。

直观地能想到的 JavaScript 的 Model 是一个 JSON 对象,差不多,不过 Backbone 赋予 Model 默认属性,只能通过 getter/setter 方法来访问 Model 中的属性值,不能直接用点操作符,相当于 Backbone 的属性是私有的。

声明 Model 类

var Person = Backbone.Model.extend({
    defaults : { //看上去是指定默认值,同时也是声明有些什么属性
        name : ‘unknown‘,
        age : 20
    }
}); 

使用 Model

// 实例化 Model 对象
var john = new Person({
    name : ‘John‘  //没有指定 age,默认为 20
});  

console.log("1: " + john.name); //undefined
console.log("2: " + john.get(‘name‘)); //john

console.log("3: " + john.get(‘age‘)); //20

john.age = 45; //这种方式赋值, 不能设置到 john.attributes 中去
console.log("4: " + john.get(‘age‘)); //20

john.set({age: 100});
console.dir(john);

上面输出为

因为存储的字段都在对象的 attributes 的属性中,所以不能简单的用点操作来存取值,而要使用

john.get(‘name‘);
john.escape(‘name‘);  //可转义 HTML 标签
john.set({name:  ‘Johnson‘});
john.set(‘name‘, ‘Johnson‘);

再看在 View 中如何显示 Model 中的属性值,因为模板是用点操作来访问属性值的,所以 model 要调用 toJSON() 把属性值释放到第一层级上来。完整的渲染 Model 数据的例子如下:

<!DOCTYPE html>
<html>
     <head>
         <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
         <script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.2/underscore-min.js"></script>
         <script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min.js"></script>
     </head>
     <body>
        <div id="container"></div>

        <script type="text/template" id="person_template">
            <%= name %>‘s age is <%= age %>
        </script>
    </body>
</html>

<script>
    //定义 Model
    var Person = Backbone.Model.extend({
        defaults : { //声明属性,并指定默认值
            name : ‘unknown‘,
            age : 20
        }
    });  

    var PeopleView = Backbone.View.extend({
        el: ‘#container‘,
        initialize: function(options) {
            this.render();
        },
        render: function() {
            var template = _.template($("#person_template").html());

            //模板中使用点操作符来访问属性的,obj.name, 所以要 toJSON() 转换
            this.$el.html(template(this.model.toJSON()));
        }
    });

    // 实例化 Model 对象
    var john = new Person({
        name : ‘John‘
    });  

    john.set(‘age‘, 30);
    john.age = 45; //这种方式赋值不管用的

    var peopleView = new PeopleView({model: john});
</script>

点击链接 http://jsfiddle.net/Unmi/4qXz7/ 执行代码可看到结果。上面代码在网页中输出为

John‘s age is 30

现实应用中,一般操作的都是 Model 所组成的集合,所以后面我们会用到 Backbone 的 Collection。这也是 Backbone 中一个重要的概念,继续中。

本文链接 http://unmi.cc/backbone-js-with-model/, 来自 隔叶黄莺 Unmi Blog

时间: 2024-10-28 11:51:56

Backbone.js 中使用 Model的相关文章

Backbone.js中的Events模块使用

本文先从项目组现有对Backbone.js中的Events模块的使用进行分析,然后列举了对Events模块的扩展使用. Events哈希 Backbone的events哈希允许我们为el相关的自定义选择器或者直接为el本身(没有选择符的情况)提供事件监听器.事件采用的是‘evnetName selector’: 'callbackFunction'这样的形式,并且支持大量的事件类型,包括click.mouseover.dblclick.blur等,但还是有些事件类型是不支持的,例如:hover事

Backbone.js学习之Model

首先,我们看一下官方文档中对Model的解释(或者说定义): Models are the heart of any JavaScript application, containing the interactive data as well as a large part of the logic surrounding it: conversions, validations, computed properties, and access control. You extend Back

理解 Backbone.js中的bind和bindAll

http://blog.bigbinary.com/2011/08/18/understanding-bind-and-bindall-in-backbone.html http://wenzhixin.net.cn/2013/11/01/understanding_bind_bindall http://chaoskeh.com/blog/use-underscore-bindall-carefully.html

使用Backbone.js, ExpressJS, node.js, MongoDB的web应用样板工程

这是web应用的一个完整的样板工程,用到了Backbone.js & Marionette, node.js & ExpressJS,MongoDB & Moogoose, Handlebars, Grunt.js, Bower和Browserify! 我建立了一个超级基础的单页面应用程序(SPA),就是一个简单的通讯录管理器, 但麻雀虽小,五脏俱全.我写这篇文章的目的是介绍一下这个应用所用到的整个技术栈:后端,数据,前端,工具和测试.主要包括下面这些技术: 后端: node.js

Backbone.js之model篇(一)

Backbone.js之model篇(一) Backbone 是一个前端 JS 代码 MVC 框架,它不可取代 Jquery,不可取代现有的 template 库.而是和这些结合起来构建复杂的 web 前端交互应用. Backbone 主要包括 models, collections, views 和 events, controller. (一)model 关于 backbone,最基础的一个东西就是 model,这个东西就像是后端开发中的数据库映射那个 model 一样,也是数据对象的模型,

backBone.js之Model篇 (1) 简单实例

“Model是js应用的核心,包括基础的数据以及围绕着这些数据的逻辑:数据转换.验证.属性计算和访问控制”. 一.初始化方法 我们先来看一个demo,initialize,这是一个初始化方法,但是写这段代码之前,首先要在<head>元素中导入3个相应的库文件,即jQuery框架.Backbone主框架和依赖库Underscore.需要注意它们导入页面的顺序,由于代码是按照自上而下的顺序进行执行的,因此先导入jQuery框架文件:Backbone依赖于Underscore库,因此在导入Under

undercore &amp; Backbone对AMD的支持(Require.js中如何使用undercore &amp; Backbone)

RequireJS填补了前端模块化开发的空缺,RequireJS遵循AMD(异步模块定义,Asynchronous Module Definition)规范,越来越多的框架支持AMD,像最近的jQuery,但有一些也不支持,像Backbone,那如何在RequireJS使用Backbone呢?需要使用RequireJS设置它们的一些特性:如下 require.config({ paths:{ jquery : 'jquery-1.7.2', underscore : 'underscore',

30 行代码实现 JS 中的 MVC

一连串的名字走马观花式的出现和更迭,它们中一些已经渐渐淡出了大家的视野,一些还在迅速茁壮成长,一些则已经在特定的生态环境中独当一面舍我其谁.但不论如何,MVC已经并将持续深刻地影响前端工程师们的思维方式和工作方法. 很多讲解MVC的例子都从一个具体的框架的某个概念入手,比如Backbone的collection或AngularJS中model,这当然不失为一个好办法.但框架之所以是框架,而不是类库(jQuery)或者工具集(Underscore),就是因为它们的背后有着众多优秀的设计理念和最佳实

使用Underscore.js的template将Backbone.js的js代码和html代码分离

这段时间在学习Require.js和Backbone.js的过程中,发现有些项目里的HTML代码都是写在View的js代码里面的,渲染的时候需要对Collection进行循环,再将HTML代码拼接上去,这似乎不是一件非常好的事情,因为将js代码和html代码融合到一起会增加代码的维护难度,而且这个过程中考虑到性能的因素,需要将HTML代码放到一个数组中,最后进行拼接,代码写起来比较麻烦.我看到他们的代码之后就在考虑是否有一种类似php模板引擎的东西可以将Collection传递进去然后渲染. 我