【问题标题】:Backbone.js View, ParentView, Model, Collection and Template Best PracticesBackbone.js 视图、ParentView、模型、集合和模板最佳实践
【发布时间】:2014-08-11 01:09:08
【问题描述】:

我正在寻找关于 Backbone 中的视图和模型/集合的最佳实践的一些描述。我知道如何将模型添加到集合、使用模板渲染视图以及在父视图中使用视图,但是我正在寻找更多上下文,也许还有一些示例链接。

我已将此问题更新为更具体。

假设您有一个包含各种变化的网格布局,这些变化来自同一个集合。你会在这里做什么来创建这个页面?在父视图中重复的简单子视图将不起作用,因为网格项的变化太大。你:

  • 创建大量微小的视图和集合,并使用相关集合将所有这些不同的视图呈现到一个页面中?
  • 创建一个复杂的模板文件,其中包含一个循环,当您通过循环时,循环输出不同的标记?
  • 人们是否将多个视图放在一个父视图中,全部来自同一个模型?

同样,人们是否会将不同的模型混合到同一个父视图中?例如电影和电视节目 - 这些不同的模型,可以将它们添加到呈现该列表的同一个集合中吗?

谢谢!

【问题讨论】:

  • Re:“你能不能只拥有一个包含逻辑的模板并在你的视图中循环遍历集合”,哪段代码将拥有该模板?哪段代码负责响应集合中的"add""remove" 事件?并且当然允许父视图告诉其子视图使用什么模板,或者类似地,将其子视图放入父控件的容器中,并且这些容器可以根据需要自行定位和调整大小。也许一个更具体的例子会有所帮助。
  • @muistooshort 是的,我认为您的示例确实对模板位有所了解。我猜这个例子是一个网页,你的内容块都来自同一模型,但显示方式不同。重要的是它们以特定顺序显示在这些模板中。首先是特色区域,等等。您如何构建该视图?具有多种不同类型子视图的父视图?还是别的什么?

标签: javascript jquery templates backbone.js model-view-controller


【解决方案1】:

你问的问题很好。要回答这个问题,让我们从另一个角度来看看:

在我的 exp 上,我首先检查父视图上是否有任何逻辑,如排序、验证、搜索等。第二 - 具有模型的集合或仅具有数组作为属性的模型:模型是独立的并且可能在没有集合的情况下存在,例如您有导航项,并且没有任何意义为每个项目创建单独的模型并将导航作为集合作为您将永远不要使用项目本身。另一种情况是您有用户列表。你可以在很多地方使用用户模型,最好为用户和集合创建一个单独的模型来组合它。

您的 UL 案例可以通过单个模型和 items 属性以及 li 数组来解决,简单网格可能具有相同的方法,因为我没有从您的描述中看到一些特殊的包装逻辑。

但我应该指出 - 我有一项艰巨的任务是使用从服务器解析的集合构建 mansory 网格,项目是模型,因为它具有不同的数据结构、不同的模板和不同的事件侦听器。

做出我认为如下的决定:

  • 作为独立平铺的项目,可以在网格中使用,也可以独立使用。
  • 项目是模型+模板+视图。不同的模型类型有助于支持不同的数据结构,不同的视图类型有助于支持不同的事件监听器和用户交互,不同的模板 - 不同的外观。
  • collection 作为获取初始数据的工具 + 加载额外的项目 + 排列 mansonry 视图 + 根据获取的结果创建模型。

更新

让我们将这个伪代码视为 masnonry 实现:

模型可能如下所示:

var MansonryModel = Backbone.Model.extend({
        /* Common methods and properties */
    }),

    MansonryVideoModel = MansonryModel.extend({
        defaults: {
            type: 'video',
            videoUrl: '#',
            thumbnail: 'no-cover.jpg'
        }
    }),

    MansonryImageModel = MansonryModel.extend({
        defaults: {
            type: 'image',
            pictureUrl: '#',
            alt: 'no-pictire'
        }
    });

var MansonryCollection = Backbone.Collection.extend({
    model: MansonryModel
});

视图可能是这样的:

var MansonryTileView = Marionette.ItemView.extend({
        /* place to keep some common methods and properties */
    }),

    MansonryVideoTile = MansonryTileView.extend({
        template: '#video-tile',
        events: {
            'click .play': 'playVideo'
        },
        playVideo: function(){}
    }),

    MansonryImageTile = MansonryTileView.extend({
        template: '#image-tile',
        events: {
            'click .enlarge': 'enlargePicture'
        },
        enlargePicture: function(){}
    });

var MansonryListView = Marionette.CollectionView.extend({
    childView : MansonryItem
})

希望有帮助

【讨论】:

  • 您的回答涉及我感兴趣的事情。如果您有任何详细信息,我会很高兴。所以,从一开始 - 如果父视图没有逻辑,你不做一个吗?现在,对于更大的问题——如果你有一个网格列表(比如你提到的 Masonry):如果你有不同的网格项目布局(比如里面有一个额外的 div),你在这里做什么?你有多个子视图吗?还是你有模板逻辑?
  • 如果父视图没有逻辑并且不需要使用集合 - 我使用 ItemView + Model。如果以导航为例,它将是具有属性项的 NavigationModel + NavigationView 并在此数组上进行迭代。因此,您只需要一个带有模板的视图。其次,关于 mansonry,使用一些基本视图作为所有类型的父级并使用自定义模板和事件监听器扩展它是有意义的
  • 好吧——那么人们会使用带有多个子视图的基本父视图吗?并以某种方式为每个网格项使用不同的子视图?不同的型号呢?周围有这样的例子吗?
  • 请查看答案更新。 BaseView 是所有其他项目视图的“原型”,模型结构相同
  • 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2011-03-06
  • 2011-09-16
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 2013-09-15
相关资源
最近更新 更多