2012-06-08 122 views
0

我寫這樣的我的dojo小工具的ctor's。dojo小工具Id衝突

constructor: function(params){ 
     var r = this.inherited(arguments); 
     this.params = params; 
     //other ctor works 
     return r; 
    } 

我使用JSON響應作爲ctor參數instanciate小部件。像new MyWidget(res)
和JSON響應包含一個id屬性像{id: 5, text: 'Hallo'}

現在_WidgetBase構造對待這個id作爲微件ID,並拋出Tried to register widget with id==6 but that id is already registered。導致可能有其他一些小部件也在獲得id: 6另一個的主題。

我不能將JSON響應更改爲像subject_id這樣的輸出,因爲它需要改變很多東西。

我需要在小部件實例化後獲取該id。

那麼處理這個問題會是一個好的設計?

+1

'res'實際上是否包含_WidgetBase的任何參數?我的意思是,你有沒有理由不能在構造函數中執行'new MyWidget({myParams:res})'和'this.params = params.myParams;'? – Frode

+0

是的,我可以做到。然而,以前已經做過的類需要更改爲'this.params.myParams',這是很多工作。它也不太好看。沒有更好的選擇嗎? –

+0

怎麼樣'res.subject_id = res.id;刪除res.id;'在實例化之前呢?誠然,這看起來不太好:P – Frode

回答

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方法。

0

你真的需要直接將json屬性映射到你的小部件嗎? 如果沒有,那麼只需在你的小部件中有一個json屬性,並在實例化時:new myWidget({jsonObj:res}); 那麼你可以有一個getJsonId()函數返回this.jsonObj.id;