2012-02-20 15 views
3

私は、以下に示すようなbackbone.jsモデルを持っています。backbone.jsモデルを新しい配列要素で更新する

Filters = Backbone.Model.extend({ 
    defaults : { 
     title: [ ["title1", "easy"], ["title2", "hard"] ] 
    } 
}); 

私はモデルが、その後になるように、最初のレベルの配列に要素を追加しようとしています:

Filters = Backbone.Model.extend({ 
    defaults : { 
     title: [ ["title1", "easy"], ["title2", "hard"], ["title3", "medium"] ] 
    } 
}); 

私が今持っているコードはこれです:

function setFilters() { 
    var options = {}; 

    for (var facet in facets) { 
     for (var facetKey in facets[facet]) { 
      if (!filterExists(facetKey)) { 
       options[facetKey] = new Array(new Array(facets[facet][facetKey], "equals")); 
      } 
      else { 
       (filters[facetKey]).push(new Array(facets[facet][facetKey], "equals")); 
      } 
     } 
    } 

    filters.set(options); 
} 

関数filterExistsは、キー "title"がモデルに存在するかどうかを単純にチェックします。これを実行すると、フィルタ[facetKey]は定義されていません。しかし、これは私の要素を押し込むために必要な最初のレベルの配列ではありませんか?

+1

Offtopic:代わりに新しいアレイ(新しいアレイ(ファセットの[ファセット] [facetKey]、 "等しい")) ''のあなたは[ずっと短い '[[ファセットを書く理由はありませんファセット] [facetKey]、 "equals"]] '? 'filters'はグローバル変数ですか? 'filters'または' Filters'? – biziclop

+0

@biziclopはい、filtersはグローバル変数です。配列のヒントをありがとう。 – kaspnord

+0

また、 '{{title1"、 "easy"}、{"title2"、 "hard"}} 'は[[" title1 "、" easy "]、[" title2 "、" hard "]]'でなければなりません。 。 '{} 'はオブジェクトを作成するためのものです。' {name:' Joe '、city:' London '} ' – biziclop

答えて

8

あなたはモデルが.get().set()機能を持つ属性、または直接.attributesプロパティを経由してアクセスすることができます。とにかく

http://documentcloud.github.com/backbone/#Model-attributes

var filters = new Filters(); 
filters.attributes.facetKey.push([...]); 

OR

filters.set('facetKey', (filters.get('facetKey') || []).concat([...])); 

、ここにあなたの変換機能これは、場合によっては機能しない場合があります。

function setFilters() { 
    for (var facet in facets) { 
     for (var facetKey in facets[facet]) { 
      var f = [ facets[facet][facetKey], "equals" ]; 

      if(filterExists(facetKey)) { 
      // OR: if(filters.attributes[ facetKey ]){ 
       filters.attributes[ facetKey ].push(f); 
      }else{ 
       filters.attributes[ facetKey ] = [ f ]; 
      } 
     } 
    } 

    // trigger change event for all attributes 
    filters.set(filters.attributes); 
} 

ボーナス:

(filters.attributes[ facetKey ] = filters.attributes[ facetKey ] || []).push(f); 
+2

しかし、これは 'change'イベントを引き起こすでしょうか? – ggreiner

+0

'.set()'を使うだけでどんなイベントもトリガされます。オブジェクトのプロパティに直接アクセスすると、何もトリガできません。 – biziclop

+1

これは良い答えだと思います。なぜなら、@ kaspnordが尋ねてきたことを達成しているからです。しかし、 'イベント'トリガが自動的に発生しないので、問題を引き起こす可能性があります。たとえば、変更を待っているビューが自分自身を再レンダリングするなどの場合は、要素を追加した後に手動でイベントをトリガする必要がありますか? – ggreiner

関連する問題