0

コンポーネントのストレージ エラーのデバッグに多くの時間を費やしました。そのコンポーネントには無効化/有効化されたボタンがありますが、その効果は見られませんでした。しばらくすると、最後に作成したコンポーネント インスタンスのボタンが変更されていることに気付きました。宣言は次のようになります。

  constructor: function(options) {
    for(var i in options){
      this[i] = options[i];
    }
  },
  domNode: null,
  grid: null,
  data: [],
  buttons: {},

デバッグで、オブジェクトの 2 番目のインスタンスを作成すると、次のことがわかりました。

new CustomComponent({domNode: dojo.byId('secondid')})

ボタンはすでに設定されています - それらのインスタンスはすべてのインスタンスによって共有されています!

最終的に、コンポーネントに静的変数を作成しました。これは私が欲しかったものではありません!その宣言の何が間違っていますか?コンポーネントインスタンスごとに「ボタン」インスタンスを個別に作成するにはどうすればよいですか?

4

2 に答える 2

1

問題をより正確に調べました。問題は、declare ブロックが 1 回だけ実行されるため、値がインスタンスにコピーされるオブジェクトプロトタイプが作成されることです。

そのbuttons: {}ため、オブジェクトを作成し、それをすべての子にコピーします。最終的に、すべての子は同じ buttonsインスタンスを持ちます - 準静的フィールドを作成しました。

コンストラクターでオブジェクトを作成したときにすべてのバグがなくなりました。

  constructor: function(options) {
    for(var i in options){
      this[i] = options[i];
    }
    this.buttons = {}
    this.data = []
  },

これで、コンポーネントのすべてのインスタンスに独自のbuttonsオブジェクトがあります。

実際、私の問題は正確にここで説明されていました:

dojo.declare("my.classes.bar", my.classes.foo, {
  someData: [1, 2, 3, 4], // doesn't do what I want: ends up being 
于 2013-10-18T13:28:13.517 に答える