编程语言
首页 > 编程语言> > javascript – 在Backbone.js的视图中实例化模型是一种反模式吗?

javascript – 在Backbone.js的视图中实例化模型是一种反模式吗?

作者:互联网

在开发Backbone应用程序时,我经常发现自己在处理嵌套数据时在视图中实例化模型.这是一些示例数据:

{
  name: Alfred,
  age 27,
  skills: [
    {
      name: 'Web development',
      level: 'Mediocre'
    },
    {
      name: 'Eating pizza',
      level: 'Expert'
  ]
}

假设我有一些视图PersonView,它将Person对象PersonModel作为其模型(其中Alfred将是一个实例).让我们说我想把这个人的技能渲染成子视图.此时,我创建了一个新视图和一个用于处理嵌套技能数据的新模型.这就是我怀疑我做错了什么,或者至少是一些不理想的事情.

var SkillModel = Backbone.Model.extend();

var SkillView = Backbone.View.extend({
  tagName: 'li',
  initialize: function() {
    this.render();
  },
  render: function() {
    this.$el.html(someTemplate(this.model));
  }
});

var PersonView = Backbone.View.extend({
  el: ...
  initialize: ...
  renderSkills: function() {
    _.each(this.model.get('skills'), function(skill) {
      var skillModel = new SkillModel(skill);
      var skillView = new SkillView({ model: skillModel });

      self.$el.append(skillView.el);
    })
  }
});

我真的应该这样做,还是有一些更好的模式,这不涉及第三方库,解决了这个问题?我觉得我并没有以最好的方式将观点和模型脱钩.如果你想要一个具体的问题,那就是:这是一种反模式吗?

解决方法:

视图用于视图逻辑,数据逻辑模型.

考虑拥有这样的模型:

var SkillModel = Backbone.Model.extend({
});
var SkillsCollection = Backbone.Collection.extend({
    model : SkillModel
});
var PersonModel = Backbone.Model.extend({

    /*
    ** Your current model stuff
    */

    //new functionality 

    skills : null,

    initialize : function(){
        //set a property into the model that stores a collection for the skills
        this.skills = new SkillsCollection;
        //listen to the model attribute skills to change
        this.on('change:skills', this.setSkills);
    },

    setSkills : function(){
        //set the skills of the model into skills collection
        this.skills.reset( this.get('skills') );
    }

});

所以在你看来renderSkills会是这样的:

var PersonView = Backbone.View.extend({
  renderSkills: function() {
     //this.model.skills <- collection of skills
    _.each(this.model.skills, function(skill) {
      var skillView = new SkillView({ model: skillModel });

      self.$el.append(skillView.el);
    })
  }
});

我做了我的伪代码试图适应你的示例代码.但是如果你明白了,基本上你可以在模型中有一个嵌套的模型或集合,所以在视图中没有需要的数据交互/设置,一切都在模型中.我也按你的要求回答,没有第三方处理事情.但是不要介意看看这种插件的来源:
https://github.com/afeld/backbone-nested

更新:根据评论我提供了模型示例的设置:

var m = new PersonModel();
//nested collection is empty
console.log(m.skills.length);
m.set({skills : [{skill1:true}, {skill1:true}]});
//nested collection now contains two children
console.log(m.skills.length);

正如您所看到的,模型用法“始终”只是一组属性,而模型是处理它的模型.您的视图应该使用技能作为视图如何使用任何其他集合.你可以做一个.each迭代,或者更值得听一下这个集合上的添加,重置等事件(但这是本问题范围之外的其他主题).

例:
http://jsfiddle.net/9nF7R/24/

标签:javascript,backbone-js,backbone-views,decoupling,backbone-model
来源: https://codeday.me/bug/20190708/1406266.html