在这篇文章,我只挑了有用的语言助手来讲解,其它没有讲到的,大家可以去查看JavaScriptMVC的帮助文档。
注:下述功能需要引入对应的jquery/language文件夹下的插件才能使用。
1、对象的比较
$.Object.same:比较2个对象是否一样。
很难用文字去描述这个函数,我们直接来看例子可以更好理解:
$.Object.same({name: "Justin"}, {name: "JUSTIN"}) //-> false // {name:null} 表示比较这2个对象时忽略name这个属性 $.Object.same({name: "Brian"}, {name: "JUSTIN"}, {name: null}) //-> true // {name:i} 表示忽略这个name属性的值 $.Object.same({name: "Justin"}, {name: "JUSTIN"}, {name: "i"}) //-> true // deep rule $.Object.same({ person : { name: "Justin" } }, { person : { name: "JUSTIN" } }, { person : { name: "i" } }) //-> true // 支持使用一样函数来做为比较器 $.Object.same({age: "Thirty"}, {age: 30}, {age: function( a, b ){ if( a == "Thirty" ) { a = 30 } if( b == "Thirty" ) { b = 30 } return a === b; }}) //-> true
2、观察模式
我们可以实现数据属性值变化监听,那么只需要把原始数据变成观察对象即可。
这是在这里我们使用的$.Observe。
观察对象给JavaScript对象和数组提供了观察者模式的功能。
具有以下功能:
1、在对象和数组中设置和删除属性或者属性值
2、监听对象和数组的变化
3、属性嵌套也可以使用
创建一个观察对象
创建一个观察对象,或者观察数组,最简单的方式就是使用$.O(data)快捷方式:
var person = $.O({name: 'justin', age: 29}), hobbies = $.O(['programming', 'basketball', 'nose picking'])
依赖数据通过$.O,它将创建一个实例:
1、观察对象,只需要传递一个对象进来,例如:{foo: 'bar'}
2、观察数组,只需要传递一个数组进来,例如:['foo','bar']
观察数组和观察对象是非常相似的。事实上,观察数组是继承于观察对象,而且它只是添加了一个数组操作的额外方法。
你也可以通过创建一个新的简单观察对象:
var data = { addresses : [ { city: 'Chicago', state: 'IL' }, { city: 'Boston', state : 'MA' } ], name : "Justin Meyer" }, o = new $.Observe(data);
获取和设置属性值
使用attr和attrs来获取和设置属性值。
例如,你可以通过observe.attr(name)来读取这个属性的值:
// read name o.attr('name') //-> Justin Meyer
通过observe.attr(name,value)来设置这个属性的值:
// update name o.attr('name', "Brian Moschel") //-> o
观察都还可以处理嵌套数据。嵌套对象和数组可以通过$.Observe和$.Observe.List来转换。 这让你可以使用$.Observe的方法来读取嵌套属性。下述是更新第2个地址为'New York':
o.attr('addresses.1').attrs({ city: 'New York', state: 'NY' })
通过使用attrs()方法可以从观察对象中读取到所有属性。
o.attrs() // -> { addresses : [ { city: 'Chicago', state: 'IL' }, { city: 'New York', state : 'MA' } ], name : "Brian Moschel" }
监听属性值的变化
当一个属性值变化后,你能监听到它产生的事件。这里是通过2种方式去监听事件:
1、bind 监听所有变化
2、delegate 监听指定的变化
注:如果看过《JavaScriptMVC之控制器监听事件》,就会记得里面有一个叫手动绑定,也是使用这2种方式。
使用bind("change",handler(ev,attr,how,newVal,oldVal)),你可以监听到这个观察对象的任何变化产生。
下述这个句柄监听属性name的变化,how是变化['add','remove','set'], the new value and the old value.
o.bind('change', function( ev, attr, how, nevVal, oldVal ) { })
delegate(attr,event,handler(ev,newVal,oldVal))监听一个指定属性的指定事件产生。
// listen for name changes o.delegate("name","set", function(){ })
Delete让你通过匹配来监听指定多个属性和值的变化。
例如
r = $.O({type: "video", id : 5}) r.delegate("type=images id","set", function(){})
3、字符串操作
在开发中我们遇到字符串的操作肯定会很多,在这里我们把4个有用的字符串操作讲解。
$.String.deparam() 把字符串变成对象
$.String.deparam("foo=bar&person[age]=3") //->{foo: "bar",person: {age: "3"}}
$.String.getObject() 根据字符串获取对象
Foo = {Bar: {Zar: {"Ted"}}} $.String.getObject("Foo.Bar.Zar") //-> "Ted"
$.String.rsplit() 根据正则表达式把字符串转换成数组
$.String.rsplit("a.b.c.d", /\./) //-> ['a','b','c','d']
注:目前我拿到的3.2.2版本,这个函数是有问题的,需要修改rsplit.js中的rsplit函数,把
26行的retArr.push(result[0]);删除掉,就可以啦。这个应该是这个版本中的一个Bug。
$.String.sub() 使用数据替换点位符得到一个新的字符串
$.String.sub("foo {bar}",{bar: "far"}) //-> "foo far"