2013-05-10 42 views
3

我找不到有关此主题的问题,但我猜测以前有人会遇到此问题。对不起,如果我重新张贴。触发器和UI部分继承子类查看子类

我对创建的组件有问题。假设组件实现为一个ItemView,它将来自UI的某些元素定义为“View.ui”散列。

如果我想通过创建该组件的专用版本并添加额外的UI元素定义,会发生什么?我在这里得到的是,新的定义覆盖了父类的定义,所以父功能中断了。

是否有任何常见的解决方法来解决此问题?

以特殊对待这些“用户界面”和“触发器”。这使我想到的只有一个扭捏作基础木偶View类的“.extend”功能继承时,使用的东西更像是一个“属性.merge“而不是”_.extend“。

还有其他想法吗?

在此先感谢,

回答

2

您可以使用_.extend在继承对象构造合并的哈希值。

小提琴:http://jsfiddle.net/puleos/zkBCm/

var ParentView = Backbone.Marionette.ItemView.extend({ 
    ui: { 
     link : 'a', 
     checkbox : "input[type=checkbox]" 
    } 
}); 

var ChildView = ParentView.extend({ 
    ui: { 
     list : 'ul' 
    }, 
    constructor: function(options) { 
     var args = Array.prototype.slice.apply(arguments); 
     ParentView.prototype.constructor.apply(this, args); 
     this.ui = _.extend(this.ui, ParentView.prototype.ui); 
    } 
}); 

var parentView = new ParentView(); 
var childView = new ChildView(); 

console.log('parent', parentView.ui); // Returns link & checkbox 
console.log('child', childView.ui); // Returns ul, link & checkbox 
+0

它不是一个通用的解决方案,因为我将不得不将这种行为添加到扩展“ui”和“触发器”部分的所有子类,但现在可以使用。感谢Scott的建议。 – Marc 2013-05-11 02:17:47

1

同斯科特的,但我认为这是一个小更直接。我没有看到重写构造函数的重点。我正在查看每种视图类型(ItemView,CompositeView,CollectionView)的构造函数,并且它们每个构造都是不同的。因此,只需将最后一行放在初始化函数中,它就可以在所有视图中工作。

所以像这样。

initialize: function() { 
    this.ui = _.extend(this.ui, ParentView.prototype.ui); 
}, 
1

我的解决办法是更多的东西是这样的:

var ParentView = Backbone.Marionette.ItemView.extend({ 
    events: { 
     'click @ui.link': 'onLinkClick' 
    }, 

    ui: { 
     link : 'a', 
     checkbox : 'input[type=checkbox]' 
    }, 

    onLinkClick: function() { ... } 
}); 

var ChildView = ParentView.extend({ 
    events: _.extend({ 
     'click @ui.buttonStuff': 'onButtonStuffClick' 
    }, ParentView.prototype.events), 

    ui: _.extend({ 
     buttonStuff : 'button[data-action=do_stuff]' 
    }, ParentView.prototype.ui), 

    onButtonStuffClick: function() { ... } 
}); 

是的,你这样做对每个子类,但语法是相当紧凑。

我总是用Backbone做这个。我还没有尝试过任何Marionette项目,但我看不出有什么理由不起作用。

这与minijag的解决方案类似,但效率更高。每当类实例化时,就不再扩展哈希值,而是在定义类时精确地扩展它们。