使用数据集合
创建数据集合
数据集合的概念和单个数据的概念非常类似。 我们以创建一个 Todo 列表为例。首先要使用 Roof 提供的 Nodes 对象来创建集合类。
javascript
var Todos = Nodes.createClass()
然后使用这个类来实例化对象。
javascript
//可以传入初始数据
var todos = new Todos([{
content : "write roof book",
owner : "jhon"
},{
content : "run test of roof",
owner : "saber"
}])
操作数据集合
类数组操作
数据集合本身已经包含了很多常见的类数组操作函数,我们接着上面的代码继续举例
javascript
//插入新数据,默认插到尾部
todos.insert({content:"swim",owner:"jhon"})
//通过第二个参数指定插入位置
todos.insert({content:"swim",owner:"jhon"}, 0)
//更新数据,这个接口接受两个参数
//where : 匹配的数据
//setObj : 新的数据
//例如,我们让jhon的所有任务都变成basketball
todos.update({owner:"jhon"},{content:"basketbal"})
//删除数据
todos.remove({owner:"jhon"})
//清空集合
todos.empty()
//批量插入
todos.fill([{owner:"jhon"},{owner:"maya"}])
//批量替换
todos.empty().fill([{owner:"jhon"},{owner:"maya"}])
//查找某些数据。
//注意,使用这个方法或得到一个新集合
//但其中的单条数据,只是之前数据的引用。
todos.filter( function(todo) ){
return todo.get("owner") === "jhon"
})
//查找单个数据
todos.findOne({owner:"jhon"})
//查找某个数据的位置,只返回第一个找到的数据位置
todos.indexOf({owner:"jhon"})
//遍历
todos.forEach(function(todo){
console.log(todo.get("owner"))
})
//变成纯数据数组
todos.toArray()
与服务器端通信操作
如果服务器端提供数据批量操作的接口,那么我们可以非常轻松地通过集合的 push 和 pull 方法与服务器端通信。这同样需要开发者自己编写 middleware 实现。在 middleware 中 我们可以轻松地拿到集合l里进行了修改的数据:
javascript
var nodesToUpdate = this.find(function(node){
return node.is("dirty")
}).toArray()
集合事件的监听
数据集合和单个数据一样,当执行 insert 等方法时,它会抛出休息来供我们监听。例如
javascript
todos.on("inserted", function(){
console.log("新插入数据")
})
todos.insert({content:"just for fun",owner:"jhon"})
单个数据的销毁
我们通过 `find`, `findOne` 等函数获取到集合中的单个数据后,可以调用数据的 `destroy` 方法。当单个数据被销毁时,集合会自动移除该数据。
自定义API
对集合也可以自定义API:
javascript
var UserList = Nodes.createClass({
setAllName : function(name){
return this.forEach(function(node){
node.set("name", name)
})
},
getTotalAge : function( ){
var total = 0
this.forEach(function( node){
total += node.get("age")
})
return total
}
})
var users = new UserList
users.insert({"name":"jhon", age:21})
users.insert({"name":"maya", age:32})
//可以使用api了
console.log( users.getTotalAge() ) //53
users.setAllName("jesper")
console.log(users.get(0).get("name")) // "jesper"
console.log(users.get(1).get("name")) // "jesper"
指定集合中的单个数据的类型
可以在创建集合时,指定单个数据的类型。
javascript
var Todo = Node.createClass()
var Todos = Nodes.createClass({
$factory : Todo
})
如果你的集合没有使用自定义 api, 那么还可以简写:
javascript
var Todo = Node.createClass()
var Todos = Nodes.createClass( Todo )
注意,即使你没有为单个元素指定 class,其中的每个元素也会被匿名的 Node class包裹。所以你通过 find 等 api 获取到的单个元素,仍然有 get\set 等Node api。