Views Backbone.js继承视图

Views Backbone.js继承视图,views,backbone.js,inheritance,Views,Backbone.js,Inheritance,我有一个FormView,它可以处理诸如保存和取消之类的事件。我还有一个AjaxFormView,它通过ajax处理保存、取消和获取表单。我有一个AssetFormView,可以处理保存、取消、通过ajax获取、删除和打印。 诸如此类。有相当多的重复 我在这个帖子里找到了一个帖子 在他展示的地方,你可以扩展视图。然而,我发现当我在页面上有多个版本的视图时,会有属性交叉授粉。是否没有内置的方法来继承主干中的视图,这是安全的 谢谢 雷夫 *嗯,这个东西很厚,我目前的异花授粉问题可能是(可能是)我的一

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

我在这个帖子里找到了一个帖子

在他展示的地方,你可以扩展视图。然而,我发现当我在页面上有多个版本的视图时,会有属性交叉授粉。是否没有内置的方法来继承主干中的视图,这是安全的

谢谢

雷夫


*嗯,这个东西很厚,我目前的异花授粉问题可能是(可能是)我的一些错误造成的,但问题仍然存在,这不是,也不是一个重要的特征,继承视图的一些方法?

我想看看你说你的属性是交叉轮询的意思

View.extend
机制运行得很好。不过,请务必注意,您正在使用新功能扩展一个原型。通过原型继承,原型与新实例共享其对象

我猜当你说你的财产是“交叉调查”时,你实际上是在做这样的事情:

var baseModel = Backbone.Model.extend({
    defaults: {
        foo: { bar: "baz" }
    }
});
_.extend(this.events, this.additionalEvents);
由于对象是共享的,因此
baseModel
的每个实例最终都会为
foo
拥有相同的对象,这给人一种异花授粉的感觉

相反,如果您将默认值定义为一个函数,那么每个实例将获得它自己的
foo
对象副本,您的交叉授粉就消失了

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

当然,如果没有代码,我们无法确定您的问题是什么。只需知道,这一机制在社区中得到了很好的使用,没有任何问题。它是安全的。您只需要了解发生了什么。

我不确定这是否与您遇到的问题相同,但我希望在父类中定义一些事件,然后让子类在不重写属性的情况下扩展属性

如果我这样做,我将覆盖父级定义的内容:

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');
    }
});
我将得到“未捕获错误:方法“onOtherButtonClicked”不存在”,因为我正在修改App.parent的事件字段<代码>App.child 2正在爆炸,因为它无法看到
App.child
放在那里的事件

将其更改为:

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

我能够保护家长。

你必须更具体地说明你的问题,才能得到有用的答案:展示一些代码,说出你的期望,说出你的问题所在。主干的
extend
功能是主要的继承机制,正如您链接到的帖子中所展示的-什么不起作用?是的,通常情况下,我会非常沮丧,最后向stackoverflow发问,结果发现要么我犯了错误,要么我很快就找到了解决方案。由于我不能收回问题,希望这将作为指向这个主题的好文章的指针。好吧,那么你的意思是,如果我做Backbone.Model.extend({myProperty:“hello”}),那么myProperty本质上是一个静态属性,如果我将其定义为Backbone.Model.extend({myProperty:function(){“hello”})它将是一个实例属性,并且每个实例都是唯一的?如果是这样的话,那就奇怪地解释了很多。我想我必须以函数的形式访问我的所有属性,但这对于理解3美元到底是怎么回事来说是一个很小的代价。非常感谢你提供的信息和你对事实的确认,如果你看到这一点的话。我要做的是在每个实例上放置对象集合,以跟踪我在父视图中创建的子视图。发生的事情是,我正在取回对象,但当我在对象上设置属性时,它不会“粘住”。无论如何,这可能不是一个很好的模式,但我希望现在能够做到这一点。我会尝试一些事情,如果我弄明白了,我会报告回来。好的,我发布了一个新主题,显示我在做什么,并询问我是否疯了不,函数与属性的交换只适用于模型的
默认值
属性。主干网只是检查它是否是一个函数并调用它,或者直接使用数据。看:哇,这是一份难以置信的文件!我的意思是,我一直在阅读代码并遵循它,但这是如此容易!谢谢你的链接!根据这种情况,我实际上是在使用视图,而不是模型,所以我基本上做了同样的事情(尽管他们做得更优雅,我可能会遵循套件)。请参阅上述评论中的链接。再次感谢!