zoukankan      html  css  js  c++  java
  • [Backbone.js]如何处理Model里面嵌入的Collection?

    写了近半个月的backbone.js代码,从一开始的todo到现在做仿微信的网页聊天,其中最大的困惑就在于如何处理比较复杂的Model,其内嵌了一个或者多个Collections。

    假设我们有一个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看到值:

    我们添加一些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});

    欢迎讨论^^

  • 相关阅读:
    Maven插件系列之spring-boot-maven-plugin
    Java中getResourceAsStream的用法
    【redis】【linux】-bash: redis-cli: 未找到命令
    【bat】杀死指定端口
    【bat】查看端口占用情况
    【java】【springboot】nohup: 无法运行命令'java': 没有那个文件或目录
    【springboot】启动指定内存大小
    【java】【spring】源码分析,@AliasFor互为别名
    【idea】设置安装插件位置
    【记录】【springboot】java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal解决
  • 原文地址:https://www.cnblogs.com/qgymje/p/3572939.html
Copyright © 2011-2022 走看看