Angularjs 在数据结构的模式/访问部分之间切换
鉴于以下数据:Angularjs 在数据结构的模式/访问部分之间切换,angularjs,Angularjs,鉴于以下数据: { id: "", title: "", // modes one: { stage: 1, order: 3, more: "", } two: { stage: 14, order: 5,
{
id: "",
title: "",
// modes
one: {
stage: 1,
order: 3,
more: "",
}
two: {
stage: 14,
order: 5,
more: "",
}
// ...
},
// ...
如何将以下两段代码组合成一段使用变量作为模式切换机制的代码
// If selected mode was "one"
<li ng-repeat="item in items | orderBy: ['one.stage', 'one.order']
| filter: oneFilter" ng-class="{ topline: isNewOneStage( item )}">
{{ item.title }},
{{ item.one.stage }}
// ...
</li>
// If selected mode was "two"
<li ng-repeat="item in items | orderBy: ['two.stage', 'two.order']
| filter: twoFilter" ng-class="{ topline: isNewTwoStage( item )}">
{{ item.title }},
{{ item.two.stage }}
// ...
</li>
//如果选择的模式为“一”
{{item.title}},
{{item.one.stage}
// ...
//如果选择的模式为“2”
{{item.title}},
{{item.two.stage}
// ...
由于这两段代码完全相同——除了模式之外——我希望避免代码重复。(还请注意,最终将有不止两种模式。)我同意Michael的观点,您可能应该重新组织代码,但如果您必须同时拥有所有代码,则可以根据您使用的angular版本执行此操作:
// variable mode is either 'one' or 'two'
<li ng-repeat="item in items | orderBy: [ mode + '.stage', mode + '.order']
| filter: (mode == 'one' ? oneFilter: twoFilter)" ng-class="{ topline: (mode == 'one' ? isNewOneStage: isNewTwoStage)( item )}">
{{ item.title }},
{{ item[mode].stage }}
// ...
</li>
//变量模式为“一”或“二”
{{item.title}},
{{item[mode].stage}
// ...
我建议将此数据结构转换为更合适的表示形式。我认为您必须迭代对象的属性,并确定它是否是一个对象(一,二,…)。可能有一种解决方案可以直接在html中以您想要的方式进行迭代,但这将成为不可读的代码。您可以在加载数据的服务或控制器中进行转换。谢谢,一旦我意识到item[mode]
是有效的表示法,我就设法重新组织了一些代码,以便根据模式变量进行切换。现在很干净:)