0

免責事項: 私は (AngularJS から来た) Backbone.js を初めて使用するので、これがどのように機能するかについて不正確なメンタル モデルを持っている可能性があります。

モデルに属性を作成しているオブジェクト characterNodes があります。characterNodes は次のようになります。

 var characterNodes = {
  character_1: {
      stories: [// list of Stories]
  },
  character_2: {
      stories: [// list of Stories]
  }
  ...
}

私のバックボーン モデルは次のようになります。

var StoryGraph = joint.dia.Graph.extend({

    initialize: function() {
        // Call parent constructor
        StoryGraph.__super__.initialize.apply(this, []);

        this.set('characterNodes', characterNodes);

        this.on('change:characterNodes', function() { 
            alert('test');
        });
    }
  });

各ストーリーには、アプリケーションの他の場所で変更されるプロパティ「isUnlocked」があります。このプロパティが変更されるたびに、イベントを発生させたい (つまり、アラート 'test' がポップアップする必要があります)。上記のコードでは、イベントは発生しないようです。

これが機能するはずかどうかをバックボーンのドキュメントから明確に理解することはできません- characterNodes のプロパティ(またはサブプロパティ、サブサブプロパティなど)が変更されるたびに on('change:characterNodes') が起動します? それとも、オブジェクトへのポインターが変更されたとき、つまり別のオブジェクトに置き換えられたときだけですか? それとも私は何か他のことを間違っていますか?ありがとう!

4

2 に答える 2

0

関数を定義する代わりに関数を呼び出して、3 番目の引数を渡してコンテキスト呼び出しを維持してください。

このようなもの:

 this.on('change:characterNodes', this.AlertSomething, this);

それが役に立てば幸い。

于 2014-07-07T22:51:37.953 に答える
0

Backbone は魔法のようなことはしません。基本的に、新しいオブジェクトにchangeを設定した場合にのみ、イベントが発生します。"characterNodes"そのオブジェクトのネストされたプロパティを変更している場合、Backbone はそれが発生したことを認識しません。次の 3 つのオプションがあります: a) オブジェクト全体を変更する (コピーを作成するなど)、b)ネストされたプロパティを変更するたびにchange手動でイベントを発生させる ( m.trigger("change:characterNodes"))、c) ネストされたオブジェクトを使用しない。最上位プロパティとして「character1_Stories」を持ちます。

オプション c) が望ましい。モデルのプロパティをフラットに保つようにしてください。オプション a) も問題ありませんが、オブジェクトをコピーする必要があるという欠点があります。オプション b) は推奨されません。これは、Backbone がモデル プロパティの以前の値を追跡するためです ( m.previous("characterNodes"))。ネストされたプロパティを変更すると、以前の値は新しい値と同じオブジェクトへの同じ参照を持つため、以前の状態は反映されません。

于 2014-07-08T07:29:23.660 に答える