0

モデルのオブジェクトに関連するビューの要素にアクセスするにはどうすればよいですか?

たとえば、のコレクションがありProductsます。各製品にはcolor特性があります。colorに等しいすべての製品を「非表示」(つまり、ビュー表現を削除)したいと思い"red"ます。

destroy()私がこれまでに知っている唯一の方法は、Modelのオブジェクト(以下のコード)の(たとえば)メソッドを呼び出すことです。しかし、私はモデルのオブジェクトを破壊したくありません。モデルを変更せずにビューの要素を削除することは可能ですか?

// App
hide_red_products: function() { 
  Product.each(function(x) {
    if (x.attributes.color == "red") { x.destroy() }
  })
}


// Products' view
initialize: function() {
  this.model.bind('destroy', this.remove_element, this);
}

remove_element: function() {
  return $(this.el).remove();
}
4

1 に答える 1

2

モデルは、ビューの実行内容を制御するべきではありません。

このメソッドを使用しtriggerてイベントをトリガーする必要があります。色が特定の色から赤に変わると仮定して、changeイベントを使用する必要があります。変更イベントをリッスンする場合は、hide_red_productsメソッドも必要ありません。

// App
hide_red_products: function() { 
  Product.each(function(x) {

    //if (x.attributes.color == "red") { x.trigger() }
    // you should never access a models attributes using the attributes key
    if (x.get('color') === 'red') { x.trigger('change'); } // shouldn't actually need this.
  })
}


// Products' view
initialize: function() {
  //this.model.bind('destroy', this.remove_element, this);
  this.model.bind('change', this.remove_element, this);
}

remove_element: function(model) {
  if (model.get('color') === 'red') {
     $(this.el).remove();
  }
}

前に述べたように、ビューが変更イベントをリッスンする場合は、要素を削除するためのメソッドを呼び出す必要はありません。必要だと思われる場合はchange、またはカスタムイベントを使用して自分でトリガーできますx.trigger('changedToRed');

于 2012-04-13T23:34:09.800 に答える