[Backbone.js]如何处理Model里面嵌入的Collection?
2014-02-28 10:05
417 查看
写了近半个月的backbone.js代码,从一开始的todo到现在做仿微信的网页聊天,其中最大的困惑就在于如何处理比较复杂的Model,其内嵌了一个或者多个Collections。
假设我们有一个Person的Model,一个Person会有多个工作,那么我们将jobs这个属性设置为一个Collection:
初始化代码如下:
下一步,给Person设置jobs的属性:
然后创建jobs的collection以及person object,将jobs赋值给person.jobs属性:
通过chrome的console看到值:
![](http://images.cnitblog.com/i/328839/201402/280957209872806.jpg)
我们添加一些view,因为在backbone.js里view才是MVC里的Controller:
这里要为Job单独设置一个view是因为一个model对应一个view的'BB原则',方便在model改变的时候,view改变。
最后new PersonView:
![](http://images.cnitblog.com/i/328839/201402/281003407408458.jpg)
![](http://images.cnitblog.com/i/328839/201402/281003518648624.jpg)
欢迎讨论^^
假设我们有一个Person的Model,一个Person会有多个工作,那么我们将jobs这个属性设置为一个Collection:
初始化代码如下:
var Job = Backbone.Model.extend({ }); var Jobs = Backbone.Collection.extend({ model:Job, }); var Person = Backbone.Model.extend({ });
下一步,给Person设置jobs的属性:
var Person = Backbone.Model.extend({ initialize:function(options){ this.set('jobs',options.jobs); } });
然后创建jobs的collection以及person object,将jobs赋值给person.jobs属性:
var jobs = new Jobs([{name:'PHP工程师'},{name:'设计师'},{name:'测试人员'}]); var jimmy = new Person({jobs:jobs});
通过chrome的console看到值:
![](http://images.cnitblog.com/i/328839/201402/280957209872806.jpg)
我们添加一些view,因为在backbone.js里view才是MVC里的Controller:
var PersonView = Backbone.View.extend({ tagName:'ul', initialize:function(){ this.render(); this.model.get('jobs').on('add',this.addFirst,this); }, addFirst:function(job){ var jobView = new JobView({model:job}); this.$el.prepend(jobView.render().el); }, renderOne:function(job){ var jobView = new JobView({model:job}); this.$el.append(jobView.render().el); }, render:function(){ var jobs = this.model.get('jobs'); jobs.each(function(job){ this.renderOne(job); },this); $(document.body).append(this.el); } }); var JobView = Backbone.View.extend({ tagName:'li', template:'<%=name%>', initialize:function(){ this.model.on('change',this.render,this); }, render:function(){ var template = _.template(this.template,this.model.toJSON()); this.$el.html(template); return this; }, });
这里要为Job单独设置一个view是因为一个model对应一个view的'BB原则',方便在model改变的时候,view改变。
最后new PersonView:
var jimmyView = new PersonView({model:jimmy});
![](http://images.cnitblog.com/i/328839/201402/281003407408458.jpg)
![](http://images.cnitblog.com/i/328839/201402/281003518648624.jpg)
欢迎讨论^^
相关文章推荐
- 详解Backbone.js框架中的模型Model与其集合collection
- Backbone.js框架中Model与Collection的使用实例
- knockout里面一个页面需要绑定多个ViewModel如何处理
- 详解Backbone.js框架中的模型Model与其集合collection
- Backbone.js 显示Collection里面的一个元素
- Backbone中的model和collection在做save或者create操作时, 如何选择用POST还是PUT方法 ?
- Backbone.js框架中Model与Collection的使用实例
- JS 里面的 eval() 函数的作用和报错之后的处理
- js处理iframe中子页面与父页面里面对象的取得的解决方案
- 【SSH网上商城项目实战24】Struts2中如何处理多个Model请求
- 在Scala里面如何使用正则处理数据
- 如何处理 在html中 li 的高度自适应(且li里面的内容有浮动的情况下)
- 201507271337_《Backbone之三——Event、Controller(Router)、View、Collection、Model》
- 如何写一个跨浏览器的事件处理程序 js
- Ember.js 入门指南——model的关联关系处理
- Backbone.js源码分析系列之Collection模块
- js中如何建立model数据模型
- 如何在C#里面象js一样可以直接计算字符串的值
- 关于backbone.js的collection问题
- 如何在tableviewcell里面嵌入switch控件以及如何获取switch控件数据