【问题标题】:Backbone defaults view eventsBackbone 默认视图事件
【发布时间】:2013-11-09 01:06:10
【问题描述】:

是否可以创建一组存在于每个视图中的默认事件?例如,如果我的应用程序中的每个视图都包含一个设置按钮

        events: {
            "click #settings" : "goSettings"
        },
        ...
        goSettings: function() {
            // settings show function
        });

我怎样才能打包这个事件以包含在我的应用程序的每个视图中?

【问题讨论】:

    标签: backbone.js backbone-views backbone-events


    【解决方案1】:

    问题在于View#extend 只是覆盖现有属性,因此您不能将'click #settings' 放在基类和子类中。但是,您可以轻松地将extend 替换为您自己的合并events 的东西。像这样的:

    var B = Backbone.View.extend({
        events: {
            'click #settings': 'goSettings'
        }
    }, {
        extend: function(properties, classProperties) {
            properties.events = _({}).extend(
                properties.events || { },
                this.prototype.events
            );
            return Backbone.View.extend.call(this, properties, classProperties);
        }
    });
    

    然后扩展 B 而不是 Backbone.View 以供您查看。

    演示:http://jsfiddle.net/ambiguous/Kgh3V/

    【讨论】:

      【解决方案2】:

      您可以使用事件和函数创建一个基本视图,然后让您的其他视图继承它。我喜欢这里描述的模式,因为它设置简单并且可以根据需要轻松覆盖:http://www.scottlogic.com/blog/2012/12/14/view-inheritance-in-backbone.html

      基本视图如下所示:

      var BaseSearchView = function(options) {
        this.inheritedEvents = [];
        Backbone.View.call(this, options);
      }
      
      _.extend(BaseView.prototype, Backbone.View.prototype, {
        baseEvents: {},
      
        initialize: function(options) {
          // generic initialization here
          this.addEvents({
            "click #settings" : "goSettings"
          });
          this.initializeInternal(options);
        },
      
        render: function() {
          // generic render here
          this.renderInternal();
          return this;
        },
      
        events: function() {
          var e = _.extend({}, this.baseEvents);
          _.each(this.inheritedEvents, function(events) {
            e = _.extend(e, events);
          });
          return e;
        },
      
        addEvents: function(eventObj) {
          this.inheritedEvents.push(eventObj);
        },
      
        goSettings: function() {
              // settings show function
        }
      });
      
      BaseView.extend = Backbone.View.extend;
      

      你的孩子是这样的:

      var MyView = BaseView.extend({
      
        initializeInternal: function(options) {
          // do something
          // add event just for this child
          this.addEvents({
            "click #differentSettings" : "goSettings"
          });
      
        },
        renderInternal: function() {
          // do something
        }
      });
      

      【讨论】:

      • 感谢您的回答,我不确定将第一块代码放在哪里。是否将其添加到新文件 BaseView.js 或将其包含在其他位置,如 init 或路由器?
      • 是的,在它自己的文件中,包含在它的子视图之前。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 2012-08-16
      • 2012-05-16
      相关资源
      最近更新 更多