Mock icon indicating copy to clipboard operation
Mock copied to clipboard

占位符语法特性不完整

Open leeyeh opened this issue 11 years ago • 6 comments

引言

Mock.js 语法分为两类,「模板」与「占位符」。模板语法的设计相较占位符更加简洁友好,但有一个缺陷即其语法限制了模板方式只能构造 key - value 形式的数据片段。相对的,占位符语法则更加严谨。在我的理解中,模板方式是占位符方式的简化,模板方式能构造的数据是占位符方式能构造的数据的子集。

问题

在现在的版本(1.5)中,所有使用模板语法能构造的数据片段都可以使用占位符方式构造,除了:

  1. 重复元素的数组:"name|count": [{}, {} ...], "name|min-max": [{}, {} ...]
  2. 重复内容的字符串:"name|count": "value", "name|min-max": "value"

这意味着,上面这些类型的数据片段,不能独立于 key(name) 单独存在。这导致在两种情况下现有的语法无法构建所需的数据:

  • 该数据片段即为 JSON 根节点

    [{}, {}, {}, ...]
    
    "★★★★★"
    
  • 该数据片断为数组元素

    {
     "array": [
        [{}, {}, {}, ...]
        ...
      ]
    }
    
    {
      "array": ["★★★", "★★★★★", ...]
    }
    

其中,「重复元素的数组作为 JSON 根节点」是 Restful API 风格对列表资源的约定,被广泛采用——这里有一个相关的 issue: #6——无法构建此类数据也是我目前真正遇到问题。其他情况在目前的实践中几乎不会遇到,在此提出是出于对占位符语法特性完整性的考虑。

提议

这里我冒昧提出一个可行的解决方案,即增加以下占位符语法:

Basics

["@ARRAY", item, count], ["@ARRAY", item, min, max]

["@ARRAY", {}, 3] 
//=>
[{}, {}, {}]

值得指出的是,这里将占位符的形式从单纯的字符串扩展到了一个特定格式的对象。

Helpers

"@REPEAT('string', count)", "@REPEAT('string', min, max)"

{
  "array|10": ["@REPEAT('★', 1, 5)"]
}
//=>
{
  "array": ["★★★", "★★★★★", ...]
}

leeyeh avatar Jan 06 '15 06:01 leeyeh

请问各位 maintainers 有任何想法或者建议吗?

leeyeh avatar Feb 02 '15 12:02 leeyeh

#37

nuysoft avatar Mar 05 '15 13:03 nuysoft

采纳。 会在这里 https://github.com/nuysoft/Mock/blob/refactoring/src/mock/handler.js#L77 实现。

nuysoft avatar Mar 05 '15 13:03 nuysoft

质量好高的Issue!!!

Bosn avatar May 07 '15 09:05 Bosn

这个实现了吗?

lili21 avatar Nov 14 '17 03:11 lili21

缓缓打出一个?

cjz9032 avatar May 08 '20 10:05 cjz9032