背景
我正在为几乎没有互联网经验的人设计一些博客软件。观察他们与互联网的互动,随着他们必须填写的表格数量的增加,客户变得更加恼火。为了解决这个问题,我想将博客的创建保留在一个页面上,所有编辑都在内联完成。
他们建立博客文章的方式是
- 选择一个“块”内容,将其放置在画布上。
- 编辑块内联,直到他们对材料感到满意,
- 添加另一个块,冲洗并重复直到完成。
- 保存帖子,然后将数据从会话发送到服务器。
我已经创建了允许所有内联内容创建工作顺利进行的包。然而,让模式来打球通常是另一种野兽。我想将每个块构建为空格键模板,并在每个帖子中都有一个模板字段指定要呈现的模板。这种方法失败的地方在于,我不希望所有可能的帖子都有一个庞大的架构。最好扩展 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 为每种块类型选择其中的一部分。
有什么建议吗?(重构、传递代码等)