0

背景

我正在为几乎没有互联网经验的人设计一些博客软件。观察他们与互联网的互动,随着他们必须填写的表格数量的增加,客户变得更加恼火。为了解决这个问题,我想将博客的创建保留在一个页面上,所有编辑都在内联完成。

他们建立博客文章的方式是

  1. 选择一个“块”内容,将其放置在画布上。
  2. 编辑块内联,直到他们对材料感到满意,
  3. 添加另一个块,冲洗并重复直到完成。
  4. 保存帖子,然后将数据从会话发送到服务器。

我已经创建了允许所有内联内容创建工作顺利进行的包。然而,让模式来打球通常是另一种野兽。我想将每个块构建为空格键模板,并在每个帖子中都有一个模板字段指定要呈现的模板。这种方法失败的地方在于,我不希望所有可能的帖子都有一个庞大的架构。最好扩展 Post 的子模式以匹配 Template 字段,而不是将大量帖子缩减为小帖子。不幸的是,Collection2 被证明有点挑剔,允许我根据模板字段动态扩展子模式。


基本模式

@Posts = new Mongo.Collection 'posts'

Schemas = {}
Blocks  = {}

#  B L O C K S  -------------------------------------------------------------

Blocks.Title = new SimpleSchema
  title:
    type: String
    defaultValue: 'Click me to enter a title for this post!'
    max: 200

Blocks.Body = new SimpleSchema
  body:
    type: String
    defaultValue: 'Click me to enter some body text!'
    label: 'Body'

blockMap = {
  'Title': Blocks.Title
  'Body': Blocks.Body
} 


#  S C H E M A S  -----------------------------------------------------------

#- START PROBLEM AREA ---

Schemas.Block = new SimpleSchema [
  # Used by Spacebars to render dynamic templates. 
  template:
    type: String
    label: 'The name of the template into which this block is rendered.'
    allowedValues: ->
      return _.keys(Blocks)   # Only allow blocks that exist to be set as templates.  
  data:   # Uses the template field to elect which data it provides to it. 
    type: blockMap[@field('template').value]
  ]
#- END PROBLEM AREA ---

Schemas.Post = new SimpleSchema [ Schemas.Base,
  blocks:
    type: [Schemas.Block]
    minCount: 2
  ]

@Posts.attachSchema(Schemas.Post)

夹具数据:

Posts.insert
  blocks: [
    {
      template: 'Title'
      data:
        title: 'Hello World!'

    },
    {
      template: 'Body'
      data:
        body: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.
               Labore dolorum, et nemo eius libero incidunt saepe est alias,
               harum nesciunt ducimus facilis reiciendis. Sit odit,
               laudantium. Provident laudantium, enim adipisci.'
    }
  ]

实验

在我上面强调的部分中,正如上面所写,data: { type: ... }Object 没有字段方法。只有 autoValue 方法似乎可以访问它,这很奇怪。这也不起作用。

data:
  type: eval('Blocks.' + @field('template').value)
# >> TypeError: Object #<Object> has no method 'field'

那么如何访问该字段呢?

type 属性可以传递给构造函数,因此它可以很好地评估属性。它似乎无法从模板属性接收数据。


从这往哪儿走

不幸的是,这不允许我正在寻找的动态模式构造。所以我的问题是这个。如果我可以将构造函数传递给数据字段的类型属性,是否有可能以某种方式传递模板字段的值,以便我可以动态呈现模板?我想继续使用 Collection2,因为它非常方便。我正在尝试的另一种方法是制作一个巨大的 Block 模式,然后使用 Collection2 为每种块类型选择其中的一部分。

有什么建议吗?(重构、传递代码等)

4

0 回答 0