【问题标题】:Extending Marionette view扩展木偶视图
【发布时间】:2014-09-22 23:53:00
【问题描述】:

在我的应用程序中,我发现实现一个FrameView 很方便,它可以扩展LayoutView,但会有一些额外的逻辑来保持框架标题等(我的目标是让Regions 处理显示标题)。

从 Java 的 Swing 角度来看,LayoutView 对我来说是 JPanel,但我想把它变成 JFrame 想要的 :-)

有没有办法扩展 Marionette 视图(并执行一些初始化),使 initialize 方法保持未使用? (我不想打扰用户调用FrameView.prototype.initialize 方法来使事情正常进行)

这是我的尝试(但存在上述问题):

var FrameView = Marionette.LayoutView.extend({
  initialize: function() {
    if(!this.title) this.title = null;
  },
  setTitle: function(title) {
    this.title = title;
    this.trigger("change:title", title);
  }
})

理想情况下,FrameView 将LayoutView 与Backbone.Model 结合使用(所以我会理所当然地使用setTitle 之类的方法,尽管语法略有不同)。视图的Backbone.Model 部分将保留标题、图标等内容。

我还在学习 Backbone.js 和 Marionette,所以我的思维方式可能很奇怪。对于您的回答以及如何实现我的目标的任何建议,我将不胜感激。

【问题讨论】:

    标签: backbone.js marionette


    【解决方案1】:

    如果您只想在视图对象上使用默认的title 键,则使用该键扩展您的视图原型:

    var FrameView = Marionette.LayoutView.extend({
      title: null,
      setTitle: function(title) {
        this.title = title;
        this.trigger("change:title", title);
      }
    })
    

    【讨论】:

    • 谢谢 - 就这么简单! :-) 对我来说唯一的“缺点”是我要么必须手动实现每个字段(标题、图标……),要么自己实现Backbone.Model 类似的功能(我对此不满意)因为我宁愿重用已经完成的工作)。有没有办法在课堂上混合Backbone.Model,这样我就不必关心各个领域(并实现更大的泛化)?
    • 为什么不首先在视图中使用Backbone.Model? var FrameModel = Backbone.Model.extend({ defaults: {} /*etc*/ });var frameView = new FrameView({ model: new FrameModel() });/*use your model*/ frameView.model.set({title: 'Hey'});
    • 出于设计目的,这将失败。我希望FrameView 可以像LayoutView 一样使用——只是具有一些附加功能。在实例化视图时显式定义模型意味着用户每次都必须指定一些人工模型,这打破了拥有LayoutView API 的要求。 (此外,当用户想要为视图提供他的模型时,它会引入问题。)
    • 很难猜出你的设计目的。根据我的经验,您只需定义某种组件,该组件将包含所有必需的视图和模型,并为最终用户提供单点初始化。
    猜你喜欢
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2023-03-22
    相关资源
    最近更新 更多