Backbone.js继承视图

时间:2011-10-07 17:56:03

标签: views backbone.js inheritance

我有一个FormView来处理诸如保存和取消之类的事件。我还有一个AjaxFormView,它通过ajax处理保存,取消和获取表单。我有一个AssetFormView处理保存,取消,通过ajax,删除和打印。 等等等等。有相当多的重复。

我发现了这篇文章的帖子http://kalimotxocoding.blogspot.com/2011/03/playing-with-backbonejs-views.html

他表示你可以扩展视图。但是,我发现当我在页面上有多个版本的视图时,有一些属性交叉授粉。是否没有内置的方法来继承骨干中的视图,这是安全的吗?

谢谢,

Raif

* 嗯,这个东西很厚,我目前的异花授粉问题可能(可能是)是我的一些错误的结果,但问题仍然存在,是不是和在某种程度上继承观点会不是一个重要的特征?

2 个答案:

答案 0 :(得分:2)

当你说你的房产是交叉花粉时,我想看看你的意思。

View.extend机制运作良好。但请注意,您正在使用新功能扩展一个原型。通过原型继承,原型与新实例共享它的对象。

我猜你说当你说你的属性是“交叉传播”时,你实际上是在做这样的事情:

var baseModel = Backbone.Model.extend({
    defaults: {
        foo: { bar: "baz" }
    }
});

由于对象是共享的,baseModel的每个实例最终都会为foo提供相同的对象,给人一种交叉授粉的感觉。

相反,如果您将默认值定义为函数,那么每个实例都将获得它自己的foo对象副本,并且您的异花授粉就会消失。

var baseModel = Backbone.Model.extend({
    defaults: function() { return {
        foo: { bar: "baz" }
    } }
});

当然,没有代码,我们无法确定您的问题是什么。只知道这个机制在社区中得到了很好的使用而没有遇到麻烦。这很安全。你只需要了解发生了什么。

答案 1 :(得分:0)

我不确定这是否与您遇到的问题相同,但我希望在父类中定义一些事件,然后让子类扩展属性而不覆盖它。

如果我这样做的话,那我就压倒了父母所定义的内容:

App.parent = Backbone.View.extend({
    events: {
        'click #button-add': 'onAddButtonClicked'
        'click #button-delete': 'onDeleteButtonClicked'
    }

    onAddButtonClicked: function() {
        console.log('onAddButtonClicked');
    },

    onDeleteButtonClicked: function() {
        console.log('onDeleteButtonClicked');
    }
});

App.child = App.parent.extend({
    initialize: function() {
        // This looks redundant but it seems to protect App.parent::events
        this.events = _.extend({}, this.additionalEvents, this.events);

        // THIS IS WRONG and results in errors when I have multiple childdren:
        _.extend(this.events, this.additionalEvents); // <-- this seems to change the parent
    }

    additionalEvents: {
        'click #button-additional': 'onOtherButtonClicked'
    },

    onOtherButtonClicked: function() {
        console.log('child:onOtherButtonClicked');
    }
});

扩展父母的事件时:

_.extend(this.events, this.additionalEvents);

我得到“未捕获错误:方法'onOtherButtonClicked'不存在”因为我正在修改App.parent的事件字段。 App.child2因为无法看到App.child所发生的事件而被炸毁。

将其更改为:

this.events = _.extend({}, this.additionalEvents, this.events);

我能够保护父母。