2014/08/05 – Backbonejs

[来自: Backbone.js 开发秘笈 第2章]

Model API:

(function ($) {

    //define Model Class -------------------
    var ModelClass = Backbone.Model.extend({
        defaults: {},//Backbone 支持在模型初始化时动态进行定义 [支持多行表达式设置默认值,即值为函数]
        initialize: function () {
            //模型对象被创建后即被调用

            /* 注:如定义了默认属性,那么会覆盖在 initialize() 函数中设置的值。 */

        },
        /* 如未初始化模型标识符,则可用客户端标识符 cid */
        idAttribute: ‘code‘,//手动设置模型标识符属性名 [默认为 id ]
        validate: function (attrs) {
            //如不合法则返回一条错误信息,触发 invalid 事件
            //call save 方法时被触发
            /* 注:如调用 set() 方法时传人 {validate:true} 作为其最后一个参数也可触发
               如: model.set(‘name‘,‘value‘,{validate:true}); */
            //验证过程中,可通过 this.get() 和 this.attributes 来访问更改前的属性值
        }
    });

    //instance -------------------------
    var modelInstance = new ModelClass({
        code: 1,
        name: ‘Jeff‘
    });

    //apply ------------------------------

    /* 所有属性都被存放在对象的 attributes 属性中。 */

    //获取模型独立的副本
    var modelCopy = modelInstance.clone();
    //获取属性值
    var attValue = modelInstance.get(‘code‘);
    //设置属性值(没有则创建,可用 JSON 更新多值,更新成功返回 true )
    var isUpdate = modelInstance.set(‘name‘, ‘Penny‘);
    //删除属性
    modelInstance.unset(‘name‘);
    //清空属性
    modelInstance.clear();
    //获取属性是否存在
    var isHas = modelInstance.has(‘code‘);
    //获取 HTML 转移后的属性值
    attValue = modelInstance.escape(‘name‘);
    //验证错误事件绑定
    modelInstance.on(‘invalid‘, function (model, error) {

    });
    //或作为参数传入 set, fetch, save ,destroy 方法
    modelInstance.set(‘name‘, ‘value‘, {
        invalid: function (model, error) {

        },
        validate: true
    });
    //手动触发验证,成功返回 true [不触发 invalid 事件]
    var isValidate = modelInstance.isValid();

})(jQuery);

插件扩展:

1. 重写 setter 和 getter

(function ($) {

    //依赖 backbone.mutators.js
    //https://github.com/asciidisco/Backbone.Mutators

    /* 注:如果使用 setter 方法为属性赋值,那么触发它的唯一方式就是调用 set() 方法。
        在初始化模型时,除非为属性显示触发 change 事件,否则其 setter 赋值方法不会被调用,原因是change不会被触发。*/

    //define ----------------------------
    var ModelM = Backbone.Model.extend({
        mutators: {
            //重写虚属性
            fullName: {
                get: function () {
                    return this.firstName + ‘ ‘ + this.lastName;
                },
                set: function (key, value, options, set) {
                    var names = value.split(‘ ‘);
                    this.set(‘firstName‘, names[0], options);
                    this.set(‘lastName‘, names[0], options);
                }
            },
            //重写已有属性
            isAdmin: {
                get: function () {
                    return this.isAdmin ? "Admin" : "Guest";
                    /* 注:可通过模型对象的 attributes 属性来获得其属性的原始值
                       如: modelInstance.attributes.isAdmin */
                },
                set: function (key, value, options, set) {
                    set(key, value === "Admin", options);
                }
            }
        }
    });
    //instance --------------------------
    var modelInstance = new ModelM({
        firstName: ‘James‘,
        lastName: ‘Bell‘,
        isAdmin: true
    });
    //apply ----------------------
    modelInstance.get(‘fullName‘);
    modelInstance.set(‘fullName‘, ‘Yo ABC‘);
    //绑定赋值方法事件
    modelInstance.on(‘mutators:set:fullName‘, function (a, b, c, d) {

    });

})(jQuery);

2. 保存和恢复模型状态

(function ($) {
    //依赖 backbone.memento.js
    //https://github.com/derickbailey/backbone.memento

    //define ---------------------------
    var ModelT = Backbone.Model.extend({
        initialize: function () {
            //插件扩展
            _.extend(this, new Backbone.Memento(this, {
                ignore: [‘description‘]//被忽略的属性集合
            }));
        }
    });

    //instance -----------------
    var modelInstance = new ModelT({
        name: ‘James‘,
        description: ‘‘,
        age: 22
    });

    //apply --------------------
    modelInstance.set(‘age‘, 23);
    //保存状态
    modelInstance.store();

    modelInstance.set(‘age‘, 25);
    var ageValue = modelInstance.get(‘age‘);

    //获取之前状态
    modelInstance.restore();
    ageValue = modelInstance.get(‘age‘);

    //恢复到第一个状态
    modelInstance.restart();
    ageValue = modelInstance.get(‘age‘);

})(jQuery);

3. 工作流

(function ($) {
    //依赖 backbone.workflow.js
    //https://github.com/kendagriff/workflow.js

    //define ---------------------------
    var ModelW = Backbone.Model.extend({
        workflow: {
            initial: ‘draft‘,//默认状态
            //定义工作流转换状态集合
            events: [
                { name: ‘issue‘, from: ‘draft‘, to: ‘issued‘ },
                { name: ‘payout‘, from: ‘issued‘, to: ‘paid‘ },
                { name: ‘cancel‘, from: ‘draft‘, to: ‘canceled‘ },
                { name: ‘cancel‘, from: ‘issued‘, to: ‘canceled‘ }
            ]
        },
        initialize: function () {
            //扩展插件
            _.extend(this, new Backbone.Workflow(this, { attrName: ‘status‘ }));//设置状态属性名

            //绑定工作流相应转换事件
            this.bind(‘transition:from:draft‘, function () {
            });
            this.bind(‘transition:to:issued‘, function () {
            });
        }
    });

    //instance ------------------------
    var modelInstance = new ModelW();
    var status = modelInstance.get(‘status‘);//draft
    //工作流转换
    /* 注:只有 triggerEvent 方法才能触发转换事件 */
    modelInstance.triggerEvent(‘issue‘);
    status = modelInstance.get(‘status‘);//issued
})(jQuery);

4. 高级验证

(function ($) {
    //依赖 backbone.validation.js
    //https://github.com/thedersen/backbone.validation

    //define -----------------------------------------------------
    //插件扩展
    _.extend(Backbone.Model.prototype, Backbone.Validation.mixin);

    var ModelV = Backbone.Model.extend({
        validation: {
            name: {
                required: true,//必填
                length: 16,//字符长度
                oneOf: [‘ABCDEF‘, ‘FEDCBA‘]//唯一匹配
            },
            email: {
                pattern: ‘email‘,//类型(number, digits, email, url)和正则
                minLength: 10,//字符最小长度
                maxLength: 20,//字符最大长度
                rangeLenght: [10, 20]//字符区间
            },
            twoEmail: {
                equalTo: ‘email‘//和另一个属性相同
            },
            isAccept: {
                acceptance: true// boolean 校验
            },
            age: {
                min: 18,//数字最小
                max: 60,//数字最大
                range: [18, 60]//数字区间
            }
        }
    });

    //用法同基础校验相同

    /* 验证 HTML 表单 */
    //在 View Model 的 initialize 函数里 扩展插件 Backbone.Validation.bind(this);
    //生成的 HTML 会带有 class=‘invalid‘ data-error=‘‘
})(jQuery);

5. 复杂嵌套属性

(function ($) {
    //依赖 backbone.nested.js
    //https://github.com/afeld/backbone-nested

    //define --------------------------
    //使用其基类进行扩展
    var ModelN = Backbone.NestedModel.extend({});

    //instance -------------------------
    var modelInstance = new ModelN();

    //apply -------------------
    modelInstance.set({
        ‘name.title‘: ‘Mr‘,
        ‘name.generation‘: ‘II‘
    });
    modelInstance.get(‘name‘); //{title:‘Mr‘,generation:‘II‘}
    modelInstance.get(‘name.title‘); //Mr

    //值为数组
    modelInstance.set({
        ‘addresses‘: [
            { city: ‘Brooklyn‘, state: ‘NY‘ },
            { city: ‘Oak Park‘, state: ‘IL‘ }
        ]
    });
    modelInstance.set(‘addresses[1].state‘, ‘MI‘);
    modelInstance.get(‘addresses[1].state‘);//MI
    //add remove
    modelInstance.add(‘addresses‘, { city: ‘TianJin‘, state: ‘TJ‘ });
    modelInstance.remove(‘addresses[2]‘);
    //bind 回调事件
    modelInstance.bind(‘change:addresses[0].city‘, function (model, value) {

    });
})(jQuery);

6. 模型对象间一对一关联关系

(function ($) {
    //依赖 backbone.relational.js
    //https://github.com/pauluithol/backbone-relational

    //define ----------------------------------------
    //通过其基类进行扩展
    var UserModel = Backbone.RelationalModel.extend({});

    var BuyerModel = Backbone.RelationalModel.extend({
        relations: [
            {
                type: Backbone.HasOne,//一对一枚举值
                key: ‘user‘,//相关模型属性名称
                relatedModel: UserModel,//相关模型对象
                reverseRelation: {//反向关联设置
                    type: Backbone.HasOne,
                    key: ‘buyer‘
                }
            }
        ]
    });

    //instance ------------------------------------
    var userInstance = new UserModel({
        name: ‘James‘
    });
    var buyerInstance = new BuyerModel({
        fullName: ‘James Bell‘,
        user: userInstance
    });
    buyerInstance.get(‘user‘).get(‘name‘);//James

    var user2 = new UserModel({
        name: ‘Bell‘,
        buyer: {//快捷定义
            fullName: ‘James Bell‘
        }
    });
    user2.get(‘buyer‘).get(‘fullName‘);//James Bell

})(jQuery);

2014/08/05 – Backbonejs,布布扣,bubuko.com

时间: 2024-10-05 06:12:19

2014/08/05 – Backbonejs的相关文章

2014/08/04 – Backbonejs

[来自: Backbone.js 开发秘笈 第1章] 各种模型实际上是通过扩展其基类 Backbone.Model 实现的.同理,定义的集合是靠扩展其基类 Backbone.Collection 而实现的. 控制器的功能被分散实现在 Backbone.Router 和 Backbone.View 当中. 路由器负责处理 URL 的变化,并且委派一个视图来继续处理应用.路由器(异步)获取模型后,随即触发一个视图的更新操作. 视图负责监听 DOM 事件.它要么对模型进行更新,要么通过路由器转移到应用

2014/08/11 – Backbonejs

[来自: Backbone.js 开发秘笈 第6章] Template 用法: 通过 Underscore.js 提供的 _.template() 方法,我们可使用 <% ... %> 包含js代码:使用 <%= ... %> 输出变量值:使用 <%- ... %>输出转义后的变量值. (function ($) { //define ------------------------- var UserModel = Backbone.Model.extend(); v

2014/08/06 – Backbonejs

[来自:Backbone.js 开发秘笈 第3章] Collection API (function ($) { //define ----------------------------- var ModelD = Backbone.Model.extend({ defaults: { ID: 0, Name: '' }, idAttribute: 'ID' }); //定义集合对象 /* 在其内部,模型被存储在一个名为 models 的数组当中 */ var CollectionD = Ba

2014/08/13 – Backbonejs

[来自: Backbone.js 开发秘笈 第7章] Restful 服务调用 Collection.fetch() - 请求集合 Model.save() - 新增或修改模型(根据 Model.isNew() 方法判断操作类型) Model.destroy() - 删除模型 Model.sync() - 请求的执行方法, fetch(), save(), destroy() 都调用其方法进行操作请求 (function ($) { //define ----------------------

2014/08/14 – Backbonejs

[来自: Backbone.js 开发秘笈 第8章] 相关技术: 1. 使用 Require.js 组织项目结构 文件结构: index.html lib/ underscore.js jquery.js backbone.js js/ app.js userDefine.js index.html: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <titl

2014/08/08 – Backbonejs

[来自: Backbone.js 开发秘笈 第5章] Event API: (function ($) { //define ------------------------- var obj = {}; var obj2 = { commonEvent: function () { window.document.title = new Date().toString(); } }; //扩展对象包含事件 _.extend(obj, Backbone.Events); _.extend(obj

Bootstrap 3.2.0 源码试读 2014/08/09

第一部分 normalize.css 104至110行 code,    /* 编辑代码 */ kbd,    /* 键盘输入的文本 */ pre, samp {    /* 范例,sample的简写 */   font-family: monospace, monospace;    /* 这个地方应该是写错了,第二字体应该是serif */   font-size: 1em; } 设置字体的大小为1em,字体为monospace. 111至119行 button, input, optgro

在MyEclipse配置自己安装的Tomcat(2014.08.18)

今天因为要在tomcat下运行一个java项目,第一次嘛,遇到了不少问题,总结分享一下: 第一次,我直接将 MyEclipse 生成的项目放到 tomcat 安装目录的 webapps 目录下,运行出现404,无法访问. 然后想了想,发现这是个错误的做法.应该先通过 MyEclipse 将项目部署到 Tomcat 下: 然后, MyEclipse 自带了 tomcat,我要配置自己安装的 TomCat : (请看参考资料:http://jingyan.baidu.com/article/4853

X100S Collection Before 2014/08/01

风暴前的东京湾 // Tokyo Bay before Storm 上野公园 // Ueno Park X100S Collection Before 2014/08/01,布布扣,bubuko.com