【问题标题】:dojo Widget Id Conflictdojo 小部件 ID 冲突
【发布时间】: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


【解决方案1】:

有趣的问题!这是我的解决方案:http://jsfiddle.net/phusick/z9u8a/

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'});

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      相关资源
      最近更新 更多