什么是设置在骨干parent属性的正确方法?(What's the proper way t

2019-07-30 00:28发布

我有一个JSON文件,该文件将创建我的ParentModel以及填充孩子Records集。

ParentModel : Backbone.Model.extend({
  initialize: function() {
    this.set({ records: new Records(this.get("records")) });
  }
});

而唱片收藏是只是一个基本的骨干集合映射到一个记录模式。

问题是我需要的孩子了解父母,所以每个Record模式有可能对之父属性。 所以现在我刚刚加入这初始化方法的底部:

var self = this;
this.get("records").each(function(record) {
  record.set("parent", self);
});

这工作得很好,但是当我创建一个新的记录,我宁愿不记得要包括这4条线。

这个回答说,我可以重写初始化方法采取额外的参数,但我不能肯定我将如何让骨干在ParentModel自动传递到重写initialize方法。 任何人都可以提供关于如何做到这一点的例子吗?

我听说过的骨干关系可能帮助做我想做的,但这是另一个23KB包括。 如果是更好的方式去,我会看看如何实现它,否则我宁愿一个简单的解决方案(如果可用)。

这需要工作是否我创建一个新的ParentModel通过代码记录,或者如果它是由一个JSON提要被自动创建。

Answer 1:

我通常会发现移动的结构元素出来的属性是清洁的,所以我的记录和父属性的对象,而不是属性。 这就是说,你可以采取的收集和父对象的不同事件的优势:

var ParentModel = Backbone.Model.extend({
    initialize: function () {
        _.bindAll(this, 'adoptOne', 'adoptAll');
        this.records = new Records();

        this.on('change:records', function () {
             this.records.reset(this.get('records'));
        });
        this.records.on('reset', this.adoptAll);
        this.records.on('add', this.adoptOne);

        this.records.reset(this.get('records'));
    },

    adoptAll: function () {
       this.records.each(this.adoptOne);
    },
    adoptOne: function (model) {
        model.parent = this;
    }
});

几个测试:

var p = new ParentModel({
    name: "I am the parent",
    records: [{id: 1}, {id: 2}]
});

p.records.add({id: 3});

p.records.each(function (child) {
    console.log(child.get('id')+' '+child.parent.get('name'));
});

p.set({records: [{id: 4}]});

p.records.each(function (child) {
    console.log(child.get('id')+' '+child.parent.get('name'));
});

和小提琴http://jsfiddle.net/sPXaZ/



Answer 2:

只是要清楚,这里是你需要一个( 可以在问题的评论被找到 )的摘要:

例如,如果我想中心位置记录元素,我需要知道视框有多宽。 要知道,唯一的办法就是要知道最宽的记录元素是什么。 父对象可以是通过其子元素排序告诉我。

在我看来,你的模型必须处理显示问题; 在骨干显示由浏览处理。 所以,我想你可以创建一个视图,其听双方ParentModelRecords

var RecordView = Backbone.View.extend({
  initialize: function() {
    this.collection.on('sync', this.render, this);
  }
  render: function() {
    var widest = this.model.get('width');
  }
});

var view = new RecordView({model: ParentModel, collection: Records});

而且,在我看来,这不是给ParentModel来处理它需要在屏幕上,但它自己的视图宽度。 这里引入两个意见似乎是一点。

但是我还没有完整的图片,所以,请,如果我错了,给我你想要做什么更多的样品。



文章来源: What's the proper way to set a parent property in Backbone?
标签: backbone.js