Backbone 的使用 (二)—— Mode 篇

我们将通过一个一个小实例来逐步学习Mode
首先定义一下整体的页面结构

	<!DOCTYPE html>
	<html>
	<head>
	    <title></title>
	</head>
	<body>
	</body>
		<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.1.js"></script>
		<script type="text/javascript" src="http://underscorejs.org/underscore-min.js"></script>
		<script type="text/javascript" src="http://backbonejs.org/backbone-min.js"></script>
		<script>
			(function ($) {
			 /**
			 *此处填充代码下面练习代码
			 **/
			})(jQuery);
		</script>
	</html>

一、 extend 的理解使用
extend 就是创建自己的 model 类,可以正确的设置原型链,因此通过 extend 创建的子类 (subclasses) 也可以被深度扩展。
extend方法接受两个参数: Backbone.Model.extend(protoProps, staticProps)
参数1:protoProps,为子类的原型prototype提供属性 ,也就是创建实例方法
参数2:staticProps,为子类自身提供属性 ,也就是创建静态方法

	 var M = Backbone.Model.extend({
	     a: function () {          //实例
	         console.log('a');
	     }
	 }, {
	     b: function () {           //静态方法
	         console.log('b');
	     }
	 });
	 var model = new M;
	 model.a(); // a
	 M.b(); // b

二.、初始化 - initialize
initialize 就相当于构造函数,在函数实例化时被调用,当然不写也不会有啥子影响

	var bab= Backbone.Model.extend({
	    initialize: function(params){
	    	cosnole.log(params); // test
	        alert('Hey, you create me!');
	    }
	});
	var Bab= new bab('test');

三、 为模型指定默认属性 - defaults

	var bab = Backbone.Model.extend({
	    initialize: function(){
	        alert('Hey, you create me!');
	    },
	    defaults: {
	        name:'张三',
	        age: '38'
	    }
	})

上面我们设置了默认属性,那么改如何取用和重新设置尼?

  • 取值 - get 、attributes

和正常的构造函数有点不一样,这里取用默认属性用的是 get方法, 而不是直接 this.name 这种。

显然属性在Model是以字典(或者类似字典)的方式存在的。

可以理解成map 结构的取用.

或者利用 attributes 取用

	var bab = Backbone.Model.extend({
       initialize: function(){
           console.log('Hey, you create me!');
           this.test()
       },
       defaults: {
           name:'张三',
           age: '38'
       },
       test : function(){
       		console.log(this.attributes.name) //  张三
           	console.log(this.name); // undefined
           	console.log(this.get('name')); // 张三
       }
   });

   var Bab = new bab();
   console.log(Bab.get('name')) // 张三
  • 设置 - set
    set 的使用方法也与 get 等同,attributes 也可以进行设置(不建议如此赋值
 	var bab = Backbone.Model.extend({
        initialize: function(){
            console.log('Hey, you create me!');
            this.test()
        },
        defaults: {
            name:'张三',
            age: '38'
        },
        test : function(){
            this.set({name : '777'});
            console.log(this.get('name')); // 777
        }
    });

    var Bab = new bab();
    Bab.set({name:'change',age:'10',haha : '123'});
    Bab.attributes.name = '王二麻子';
    console.log(Bab.get('age')) // 10
    console.log(Bab.get('name ')) // 王二麻子
    console.log(Bab.get('haha')) // 123

四、监听对象中属性的变化 - change

 	var bab = Backbone.Model.extend({
        initialize: function(){
            //初始化时绑定监听
            this.bind("change:name",function(){
                alert("你改变了name属性");
            });
            this.test();
        },
        defaults: {
            name:'张三',
            age: '38'
        },
        test : function(){
            this.set({name : '777'});
            console.log(this.get('name')); // 777
        }
    });

    var Bab = new bab();

当对象name 被set 重新赋值时,change 事件就开始执行了。
这里有一点需要注意,如果 对象改变发生在监听事件以前,则监听不到,也就是说如果 将 this.test() 写在change 之前,监听则不会执行。

或者在实例后调用

	var Chapter = Backbone.Model.extend({
        defaults:{
            name : 18
        }
    });
    var cha = new Chapter;
    cha.on("change:name", function(model,name) {
        console.log(model) // 就是cha 的值
        console.log(name) // 5
    });
    cha.set({name:5});

五、验证规则 - validate
为对象属性添加验证规则,invalid 事件

	var Chapter = Backbone.Model.extend({
        initialize : function(){
            // 监听验证事件
            this.bind("invalid",function(model,error){
                alert(error);
            });
        },
        defaults:{
            age : 18
        },
        validate: function (attrs) {
            if (attrs.age < 20) {
                return "年龄不到20";
            }
        }
    });
    var cha = new Chapter;
    //save时触发验证,此时也可以赋值
    cha.save({
    	age : 25
    });

如果使用set对属性进行修改,set 后添加 {validate : true} 也可以调用

var cha = new Chapter;
cha.set({age : 22},{validate : true});

同样,与上面的change 类似,validate 也可以在实例化后调用

	var Chapter = Backbone.Model.extend({
        defaults:{
            age : 18
        },
        validate: function (attrs) {
            if (attrs.age < 20) {
                return "年龄不到20";
            }
        }
    });
    var cha = new Chapter;
    cha.on('invalid',function(model,error){
        console.log(model); // 就是cha的值
        console.log(error); // 年龄不到20
    })
    cha.save()

注意: 我这里犯了一个错误
在这里插入图片描述
因为我在validate 函数中当判断为false 时没有返回值,所以save 执行时就报错了,但是如果使用 set 后加 {validate : true} 的方式,却不会报错。

除了 invalid 的方式,bab 还提供了isValid 来检查模型状态。

	var Chapter = Backbone.Model.extend({
        defaults:{
            age : 18
        },
        validate: function (attrs) {
            if (attrs.age < 20) {
                return "年龄不到20";
            }
            return "你太大了";
        }
    });
    var cha = new Chapter;
    // cha.set({age : 25});
    if (!cha.isValid()) {
        alert(cha.validationError); // validationError 就是上面的错误提示
    }
    // 此时就不用save 等方式来触发验证了

六、服务器进行交互 - url

man1.fetch({url:'/man/',
    success:function(model,response){
        alert('success');
        //model为获取到的数据
        alert(model.get('name'));
    },error:function(){
        //当返回格式不正确或者是非json数据时,会执行此方法
        alert('error');
    }
});

这里有一点不明觉厉,单看上面的例子没有什么问题,但是这里还引入一个save, urlRoot 这些东西,个人觉得还不如直接用ajax 。(如果后面有其他了解再补充吧)

或者看看人家怎么说的 https://www.cnblogs.com/linjiqin/p/3711866.html


七、删除数据

  • unset()方法用于删除对象中指定的属性和数据
  • clear()方法用于删除模型中所有的属性和数据

在调用unset()和clear()方法清除模型数据时,会触发change事件,我们也同样可以在change事件的监听函数中通过previous()和previousAttributes()方法获取数据的上一个状态。


八、其他

  • preinitialize

For use with models as ES classes. If you define a preinitialize method, it will be invoked when the Model is first created, before any instantiation logic is run for the Model.

如果模型作为class 类调用,预初始化时被执行,和 initialize 就是启动先后的关系

  • escape
    有点类似 get ,但返回模型属性的html转义版本
	var bab = Backbone.Model.extend({
        defaults: {
            name:'<div>18</div>'
        }
    });
    var Bab = new bab();
    console.log(Bab.escape('name')) // &lt;div&gt;18&lt;/div&gt;
    console.log(Bab.get('name')) // <div>18</div>
  • has
    判断属性是否存在
	var bab = Backbone.Model.extend({
        defaults: {
            name:'<div>18</div>'
        }
    });
	var Bab = new bab();
    console.log(Bab.has("name")) // true
    console.log(Bab.has("age")) // false

其他的api 像hasChanged、changedAttributes 等等,从字面上就可以理解,不做记录了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值