3

私のアプリのロジックは非常に簡単です。JSONPを取得するモデルがあります(データには年、四半期が含まれ、四半期には異なるキー:値が含まれます)。データをフェッチした後、ビューはモデルの「変更」イベントをリッスンし、データをレンダリングします。ここまでは順調ですね。

ただし、「change:year」/「change:quarter」をリッスンし、変更に基づいて新しい URL でデータをフェッチする必要があります。ただし、「change:year」/「change:quarter」が発火すると、グローバルな「change」も発火します。

確かに、モデルの代わりにコレクションを使用する場合は、「リセット」があります。しかし、この場合、「change:year」を簡単にリッスンすることはできません。さらにいくつかのモデル (年、四半期、および四半期の各キー) を作成する必要があります。しかし、私はアプリをシンプルに保ちたいと思っています。

他の方法はありますか?それとも、より多くのモデルを作成する必要がありますか?

ありがとう。

UPD: 新しいデータをフェッチした後、モデルを再レンダリングする必要があるため、「変更」イベントがまだ必要です。

解決策: 変更が必要な属性を保持する共通のコントローラーを作成しました。そして .url() メソッドで Controller からそれらを取得して url を変更します。Collection の fetch()/"reset" 通知に固執し、"change" で Controller のリスナーを作成しました。したがって、「年」/「四半期」を変更すると、ビューはコントローラーから通知を取得し、対応するコレクションの取得-新しいURLで取得します。

4

2 に答える 2

1

change私が理解しているように、グローバルモデルイベントのみyearまたはquarter変更された場合は受け取りたくありませんが、そうする必要があります。

代わりに、グローバル変更イベントを受信するときに、それが変更されyearただけか変更されたかを確認し、通常のイベント処理をスキップできます。このようなもの:quarter

this.model.bind("change", this.render, this);
this.model.bind("change:year", this.fetchSomething, this);
this.model.bind("change:quarter", this.fetchSomething, this); 

render : function(){
    var attributesExceptYearAndQuarter = _.without(this.model.attributes, ['year', 'quarter']) 
    if(this.model.changedAttributes(attributesExceptYearAndQuarter).length > 0){
         // do the rendering
    } 
}
于 2012-10-12T15:47:10.700 に答える
1

モデルの変更リスナーで変更された属性を確認できます。

var MyModel=Backbone.Model.extend({
    initialize:function(){
      this.bind("change",this.changeModel);
      this.bind("change:year",this.changeYear);

   },
   changeModel:function(model,objs){
      //Checking changed attributes
      if (_.has(objs.changes,"year") || _.has(objs.changes,"quarter")) return this;

     console.log("Processing",objs.changes);
     return this;
  },
   changeYear:function(model,new_val){
    console.log("year changed.",new_val);
    return this;
  }

});


var mymodel=new MyModel();
mymodel.set("year",2012); 
mymodel.set("month",6);

モデルの変更イベントをリッスンするビューがある場合は、別の属性をモデルに追加し、モデルの変更イベントの代わりにこの属性の変更イベントをリッスンして、この属性が変更されたときにビューをレンダリングする必要があります。次のように、「年」および「四半期」属性が変更された属性に含まれていない場合は、changeModel 関数でこの属性の値を変更し、リスナーを起動します。

//Edit changeModel as below
changeModel:function(model,objs){
          //Checking changed attributes
          if (_.has(objs.changes,"year") || _.has(objs.changes,"quarter")) return this;

          this.set("rerender",!this.rerender); //Changing for triggering change event
         return this;
      },


//View's constructor function
initialize:function(){
   this.model.bind("change:rerender",this.render);
}
于 2012-10-12T16:12:26.640 に答える