1

Ember js を使用して、ビューのツリー ベース構造を取得しました。各ビューにはテキスト ボックスがあります。いずれかのボックスにテキストを入力して「Enter」を押すと、そのビューに「返信」が追加されます。つまり、別のビューを でインデントして<ul>、元のビューの下に追加します。

問題は、「Enter」を押すと、ember.js スクリプトの 1 行目でエラーが発生してクラッシュすることです。問題の可能性はありますか?

JS フィドルはこちら: http://jsfiddle.net/TcgJB/1/

4

1 に答える 1

0

わかりました、私はあなたのフィドルを修正したと思います:http: //jsfiddle.net/Sly7/hVdab/

主な問題は

Bap.Reply = Ember.Object.extend({
  text: null,
  children: [], // don't do that, instead declare it as null, and create
                // an empty children at instanciation time 
  addReply: function(text) {
    this.get('children').addObject(Bap.Reply.create({text:text, content: []}));
  },
});

//or an equivalent implementation, if you want each instance to be created with a default empty array:

Bap.Reply = Ember.Object.extend({
  text: null,
  children: null,

  //overriding the init method (kind of constructor for Ember's Objects
  init(): function() {
    this._super(); // very important, don't forget it
    this.set('children', []);
  },

  addReply: function(text) {
    this.get('children').addObject(Bap.Reply.create({text:text, content: []}));
  },
});

クラスを宣言するときに、そのクラスが配列の子を所有している場合は、それをnullとして宣言し[]、作成時に初期化する必要があります。これは、残り火で始まる場合の一般的な落とし穴です。実際、基本的な動作は、のすべてのインスタンスがBap.Reply同じ子配列を共有することです。

したがって、最初の子に子を追加すると、すべての子が同じ親を持ち、一部の子が兄弟と同じ子を持っているなど、構造が不安定になる可能性があります。その後、Emberは次の場合に失われると思います。バインディングを更新してビューをレンダリングする必要があるため、予期しない奇妙なエラーが発生します。

ちなみに、Emberの命名規則を尊重するために、クラスはキャメルケースにする必要があるため、いくつかのマイナーなタイプミスを修正しました。

詳細を説明する2つの便利なリンクを次に示します。

于 2012-08-24T09:48:07.847 に答える