【发布时间】:2012-06-08 14:50:12
【问题描述】:
我这样写我的道场小部件的 ctor。
constructor: function(params){
var r = this.inherited(arguments);
this.params = params;
//other ctor works
return r;
}
我使用 JSON 响应作为 ctor 参数来实例化小部件。喜欢new MyWidget(res)
并且 JSON 响应包含 id 属性,例如 {id: 5, text: 'Hallo'}
现在 _WidgetBase 构造函数将此 id 视为 Widget Id 并抛出 Tried to register widget with id==6 but that id is already registered。因为可能还有其他一些小部件也为 another 主题获取id: 6。
我无法将 JSON 响应更改为像 subject_id 这样的输出,因为它需要更改很多东西。
我需要在小部件实例化后获取该 ID。
那么处理这个问题的好设计是什么?
【问题讨论】:
-
res实际上是否包含 _WidgetBase 的任何参数?我的意思是你有什么理由不能在构造函数中只做new MyWidget({myParams: res})和this.params = params.myParams;? -
是的,我能做到。然而,之前已经在做的类需要更改为
this.params.myParams,这需要做很多工作。而且看起来也不好看。没有更好的选择吗? -
那么在实例化之前
res.subject_id = res.id; delete res.id;呢?诚然,这看起来也不是很好:P -
是的,它甚至不是一个好的设计。正确的解决方案是要求
_WidgetBase忽略来自params 的id属性并分配其自生成的id。 -
我同意你的观点,后者是几种不同的错误。我认为也许覆盖无处不在的小部件 ID 本身是一个糟糕的设计。这可能表明您正在混合模型和视图 - 在这种情况下,通过将模型命名空间泄漏到视图命名空间中。考虑到这一点,我认为
new MyWidget({subject: res})和this.subject = params.subject;是最干净的方式。
标签: dojo