关于理解表达,我有几个问题在脑子里嗡嗡作响:
ngOptions - comprehension_expression - 采用以下形式之一:
用于数组数据源:
- 数组中值的标签
- 选择数组中值的标签
- 按组分组标记数组
中的值- 通过trackexpr
选择数组轨道中的值作为标签组用于对象数据源:
- 对象中的(键,值)标签
- 选择对象
中的(键,值)标签- 按对象(按键,值)分组对象
- 按对象中的(键,值)按组选择标签组
答案 0 :(得分:15)
理解表达式只是一种以select
指令识别的特殊方式格式化的字符串。
它背后没有任何魔力,只有几种格式,因为有很多方法可以处理和表示你的集合(模型的数据结构,项目/项目属性选择作为范围的模型,关于标签的一些其他选项,分组等等。)。当你考虑所有这些选项时,允许复杂的表达式并不奇怪。
假设你有这样的代码:
<select
ng-model="color"
ng-options="c.name group by c.shade for c in colors"></select>
为了抛弃理解表达式并使用属性,你会写这样的东西:
<select
ng-model="color"
ng-data-type="object"
ng-data="colors"
ng-select="c"
ng-label="c.name"
ng-group-by="c.shade"></select>
扩展API后,属性方法可能会变得丑陋。此外,通过理解表达式,使用过滤器会更容易。
答案 1 :(得分:1)
从某种意义上说,如包所说,“ comprehension_expression”只是“一个字符串”,而另一方面,源代码只是一个字符串。编程语言只是字符串。
SQL SELECT语句
–很可能是“ comprehension_expression”的语法和功能灵感的一部分(但是它并不明显,因为在文档中没有提到它–也许如果我深入研究开发人员对话,我可能会能够找到)–
只是一个字符串。
当然,它们只是字符串,但是它们具有结构,这与他们要解决的问题有关。问题是,结构是否得到充分描述?是否明确了它的模式及其与当前问题的关系?它与其他人设计的其他结构的关系是否明显?
尽管“ comprehension_expression”只是一个字符串,但另一方面,它的复杂性几乎就是它本身就是一种副语言。
但是它在文档(https://docs.angularjs.org/api/ng/directive/ngOptions)中的描述方式确实反映了一种态度,即它“只是具有某种格式的字符串”。在ng-options的文档中将其作为ng-options指令的类型。在某种程度上,它不是一个独立的实体,它是二等公民。
列出不同格式的方式可能会给人一种奇怪的感觉,就像是一种即席即用的,而没有任何模式将不同的可能格式联系在一起(尽管如果仔细观察,就会发现有一种模式)。如果没有具有规则结构的正式语法,您可能会怀疑它们是否真的涵盖了所有可能的选择。相比之下,SQL SELECT语句的MySQL文档:https://dev.mysql.com/doc/refman/5.7/en/select.html
显然,这样的形式语法可能会令人生畏,对于“ comprehension_expression”而言可能不是必需的,另一方面,可以肯定地说它是精确定义的。
我怀疑问题的质询者对文档中提到“ comprehension_expression”有多随意感到不安;它看起来像是一种漂浮的,类似幽灵的实体,只是被简要提及,但是没有给出自己的页面等。
可能值得拥有自己的页面,因为它本身具有被视为一个实体的能力,因为这随后引发了有关“子语言”设计的讨论。它是怎么发生的? “子语言”功能不同的原因是什么?哪些功能和语法相互冲突?为什么可以将此功能与该功能一起使用,而不能与另一功能一起使用?是否有来自例如SQL,在设计这种“子语言”吗?
否则,这似乎是一个天生的发明,与同类其他DSL无关。
在有关ng-options的博客文章中, https://www.undefinednull.com/2014/08/11/a-brief-walk-through-of-the-ng-options-in-angularjs/ Shidhin先生链接到一个小讨论 https://groups.google.com/forum/#!topic/angular/4EDe8xIbjLU
仅在讨论此问题的地方。 “马特·休斯(Matt Hughes)”还表达了这样的观点:“对于一个指令,似乎还增加了许多复杂性。”
也许这没什么大不了的。我只是想把它放在那里。