【发布时间】:2014-05-13 15:05:23
【问题描述】:
在我当前的项目中,我必须处理多种类型的Categories。每个类别都必须以不同的方式呈现,并具有不同的功能。
为了实现这一点,我创建了一个Category 工厂,它在我的模型中充当“基类”。通过这种方式,我可以扩展/覆盖 Category 行为(例如,通过定义包含子类别的 MultiCategory)。
当我尝试让每个类别类型以不同方式呈现时,问题就出现了:为此,我定义了一个指令:
<div ng-repeat="category in data.categories" category="category"></div>
在我的设计中,该指令将打开category.constructor.name 来决定如何呈现自己:
<div class="container" ng-switch="category.constructor.name">
<div ng-switch-when="MultiCategory"></div>
....
</div>
但是,当我尝试这样做时,AngularJS 向我抛出了一个错误,因为它不允许 constructor.name 表达式。 (与安全有关)
我通过实现一个函数找到了解决方法
Category.prototype.getType = function() {
return this.constructor.name;
}
然后开关变成:
...ng-switch="category.getType()"...
查看jsfiddle 中的示例。
到目前为止,它工作正常,但我对这种方法不太满意。它要求我污染Category.prototype,如果使用constructor.name存在安全问题,我想解决它们。
所以我的问题是:谁能想出更好的方法?
编辑:
评论/答案集中在 ngSwitch 的使用上,但这不是这个问题提出的问题。使用
我仍然会遇到同样的问题ng-if="category.constructor.name"
重点是:确定不需要恢复到constructor.name 的模型对象类型的最佳方法是什么?我真的需要用@987654336 污染我的模型吗? @属性还是getType方法?
【问题讨论】:
-
不同类型的渲染方式有何不同?您是否考虑过使用 ng-show 根据您从扩展类型中寻找的属性有条件地显示一个大型模板的片段?
-
@AndrewChurch 这不是重点,我仍然需要以某种方式检查类别的类型。我改进了问题,请参阅我的编辑。
标签: javascript angularjs prototypal-inheritance