Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 从基础视图自动扩展事件_Backbone.js - Fatal编程技术网

Backbone.js 从基础视图自动扩展事件

Backbone.js 从基础视图自动扩展事件,backbone.js,Backbone.js,我对所有视图都有一个基类,然后在应用程序的每个部分(如配置文件)中,我也有一个基类。这样,共享模板和属性就可以在我的整个应用程序的多个级别上使用 我知道,如果您将主干视图中的事件属性设置为函数而不是对象文本,它将为您实例化,但我不确定如何利用它。我的问题是,自动扩展在基本视图中创建的事件的最佳方式是什么 我知道有一种可能性,在视图初始化时,我获取基本事件类并将当前事件扩展到它,但它似乎有点不太正常,我必须在每个视图上复制此代码。如果你知道更好的方法,请分享 谢谢。以下是我如何在我的子视图中扩展父

我对所有视图都有一个基类,然后在应用程序的每个部分(如配置文件)中,我也有一个基类。这样,共享模板和属性就可以在我的整个应用程序的多个级别上使用

我知道,如果您将主干视图中的事件属性设置为函数而不是对象文本,它将为您实例化,但我不确定如何利用它。我的问题是,自动扩展在基本视图中创建的事件的最佳方式是什么

我知道有一种可能性,在视图初始化时,我获取基本事件类并将当前事件扩展到它,但它似乎有点不太正常,我必须在每个视图上复制此代码。如果你知道更好的方法,请分享


谢谢。

以下是我如何在我的子视图中扩展父视图的事件:

var ParentView = Backbone.View.extend({

        events: {
            'click .link': 'onLinkClick'
        }
});

var ChildView = ParentView.extend({

        events: function(){
            return _.extend({
                'click .something': 'onSomethingClick',
            }, this.constructor.__super__.events);
        }
});

注意:这仅适用于主干网0.5.3。在该版本之前,您无法将事件定义为函数。

我相信JohnnyO的答案是最好的。但是我遇到了另外两种方法,我将把它们粘贴在这里

遗憾的是,没有一种“自动”解决方案不需要在每个新视图中添加额外的手写代码,但事实就是这样

 ChildView = ParentView.extend({
     name: 'ChildView',
     events: {
     },
     constructor: function(){
        this.events = _.extend( {}, ParentView.prototype.events, this.events );
        console.debug( this.events );
        ParentView.prototype.constructor.apply( this, arguments );
     },
     someFunc: function(){
         console.debug('someFunc; this.name=%s', this.name);
     } 
 });
保罗

我不知道您可以在Backbone.view.extend中提供构造函数方法。很高兴知道

 var GenericView = Backbone.View.extend({

   genericEvents: { 'click .close': 'close' },

   close: function() { console.log('closing view...'); }

 });

 var ImplView = GenericView.extend({

   events: { 'click .submit': 'submit' },

   initialize: function(options) {
     // done like this so that genericEvents don't overwrite any events
     // we've defined here (in case they share the same key)
     this.events = _.extend(this.genericEvents, this.events);
     this.delegateEvents()   
   } 
});
var ParentView = Backbone.View.extend({
    'events': {
        'click .parent-something': "onParentSomethingClick"
    }
}); 

var ChildView = ParentView.extend({
    'events': _.extend({
        'click .something': 'onSomethingClick',
    }, ParentView.prototype.events)
});
由rulfzid-

我已经设想过(并拒绝了)这种方法,但这种方法还有一个额外的扭曲之处,即将基本事件称为其他事件,以便正如作者所说的“GenericeEvents不会覆盖任何事件”。除非他说的是你在两个事件对象中传递的两个事件的某种咀嚼,否则我不确定他在说什么,我只会使用proto或prototype来引用父事件。但再一次,很高兴知道

 var GenericView = Backbone.View.extend({

   genericEvents: { 'click .close': 'close' },

   close: function() { console.log('closing view...'); }

 });

 var ImplView = GenericView.extend({

   events: { 'click .submit': 'submit' },

   initialize: function(options) {
     // done like this so that genericEvents don't overwrite any events
     // we've defined here (in case they share the same key)
     this.events = _.extend(this.genericEvents, this.events);
     this.delegateEvents()   
   } 
});
var ParentView = Backbone.View.extend({
    'events': {
        'click .parent-something': "onParentSomethingClick"
    }
}); 

var ChildView = ParentView.extend({
    'events': _.extend({
        'click .something': 'onSomethingClick',
    }, ParentView.prototype.events)
});
它并不是什么都不做,但这是迄今为止我见过的最简单的方法。

我还创建了一个关于我使用的另一种方式的要点:

你可能想看看这些帖子/链接(可能重复):另一个:外部站点:Hi Nupal,非常有效的回复,感谢你做了比我更好的检查。你发布的两个stackoverflow链接都有一个很好的答案,与下面提供的答案不同。我将在这里添加这两个问题,并使其成为这个特定问题的最终来源(其他问题更广泛)。此外,kalimotxocoding.blogspot.com的博客条目非常可怕,需要破解backbone.js core,实际上无法解决任何问题。谢谢你的意见,谢谢你。我听说过非标准但无处不在的JavaScript中的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,但从未听说过
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这是由主干核心添加的还是现代浏览器中的新事物?超级是由主干核心添加的,它映射到继承的类“prototype”。您可以在ChildView的定义中内联
。.extend({},ParentView.prototype.events,{'click':'close'})
。那么就不需要构造函数了。您通过github链接提供的“父”函数非常棒。我肯定要用你的来取代我的current\u super实现。谢谢您不想将对象以另一种方式传递到u.extend()中吗?i、 e.克隆然后用新事件覆盖超类的事件?这样,您就可以用子功能覆盖超级功能,这是一种更熟悉的继承方法。