dojo小部件Id冲突

dojo小部件Id冲突,dojo,Dojo,我这样写我的dojo小部件的ctor constructor: function(params){ var r = this.inherited(arguments); this.params = params; //other ctor works return r; } 我用JSON响应作为参数实例化小部件。像新的MyWidget(res) JSON响应包含一个id属性,如{id:5,text:'Hallo'}

我这样写我的dojo小部件的ctor

    constructor: function(params){
        var r = this.inherited(arguments);
        this.params = params;
        //other ctor works
        return r;
    }
我用JSON响应作为参数实例化小部件。像新的MyWidget(res)
JSON响应包含一个
id
属性,如
{id:5,text:'Hallo'}

现在
\u WidgetBase
构造函数将此id视为小部件id,并抛出
试图注册id==6的小部件,但该id已注册
。原因可能还有其他一些小部件也在获取另一主题的id:6

我不能像
subject\u id
那样将JSON响应更改为输出,因为它需要更改很多内容

我需要在小部件实例化后获得该id


那么,什么样的设计才是解决这个问题的好方法呢?

有趣的问题!以下是我的解决方案:


编辑:我做了一些清理,所以您只需添加
postscript
方法

您真的需要将json属性直接映射到您的小部件吗? 如果没有,那么在您的小部件中只有一个json属性,并且在实例化时:newMyWidget({jsonObj:res});
然后您可以有一个getJsonId()函数,该函数将返回this.jsonObj.id

res
是否实际包含_WidgetBase的任何参数?我的意思是,有什么原因不能只做
newmywidget({myParams:res})
this.params=params.myParams在构造函数中?是的,我可以。但是,前面已经在做这项工作的类需要更改为
this.params.myParams
,这需要做大量的工作。而且看起来也不太好。没有更好的选择吗?
res.subject\u id=res.id;删除res.id在实例化之前,然后?诚然,这看起来也不太好:PYes甚至不是一个好的设计。正确的解决方案是要求
\u WidgetBase
忽略来自params的
id
属性,并将其自身生成的
id
分配给它。我同意你的观点,后者是几种不同的错误。我认为覆盖无处不在的widget id本身可能是一个糟糕的设计。这可能表明您正在混合模型和视图—在本例中,是通过将模型名称空间泄漏到视图名称空间中。考虑到这一点,我认为
newmywidget({subject:res})
this.subject=params.subject是最干净的方法。
var Widget = declare(_WidgetBase, {

    postscript: function() {
        var id = arguments[0]["id"];
        delete arguments[0]["id"];
        this.inherited(arguments);
        this.params.id = id;
    },

    constructor: function(params) {                      
        // your constructor here
    }            

});

var widget1 = new Widget({ id: 1, text: 'Hallo 1'});
var widget2 = new Widget({ id: 1, text: 'Hallo 2'});