2011-11-09 13 views
4

私はSencha Touchのnoobです。私は頭の中に入っているかもしれません。私がしようとしているのは、私が1つのマスターリストから得たデータをフィルタリングし、次にドリルダウンすることです。だから私は主なリストを持っている - カテゴリー。カテゴリが選択されると、場所のリストが表示されます。私は私のモデルがお互いに話をするのに問題がある(私は思う)。今のように、カテゴリを選択すると、すべてのデータが返されます。必要なものはすべて選択したカテゴリです。私は、プロパティと指定された値を使用してストアをフィルタリングできます。私のカテゴリメニューから渡す変数として値を設定することは可能ですか?私はここでSencha Touchフィルターリストビューデータストア

CRてきた私のコードです:Category.js

app.views.CategoryList = Ext.extend(Ext.Panel, { 
layout: 'card', 
fullscreen: true, 
scrolling: 'vertical', 
initComponent: function() { 
    //Check if device is a phone, if so only display the title since the viewport is smaller 
    if (!Ext.is.Phone) { 
      var listTemplate = '{post_type}'; 

     } else { 
      var listTemplate = '{post_type}'; 

     } 
    this.list = new Ext.List({ 
     grouped: false, 
     indexBar: false, 
     itemTpl: '{post_type}', 
     store: app.stores.CategoryList, 
     listeners: { 
      selectionchange: {fn: this.onSelect, scope: this} 
     } 
    }); 

    ///selectionchange : function(){ 
     // this.store.filter('post_type', listTemplate) 
     //this.onSelect('post_type') 

    this.listpanel = new Ext.Panel({ 
     layout: 'fit', 
     items: this.list, 
     dockedItems: [{ 
      xtype: 'toolbar', 
      title: listingTitle 
     }], 
     listeners: { 
      activate: { fn: function(){ 
       this.list.getSelectionModel().deselectAll(); 
       Ext.repaint(); 
      }, scope: this } 
     } 
    }); 

    this.items = this.listpanel; 

    app.views.CategoryList.superclass.initComponent.call(this); 
}, 

onSelect: function(sel, records){ 
    if (records[0] !== undefined) { 
      var categoryCard = new app.views.LocationsList({ 
         store: app.stores.LocationList, 
         //store: app.stores.LocationList.filter('post_type',null), 
         prevCard: this.listpanel, 
         record: records[0] 
        }); 
        this.setActiveItem(categoryCard, 'slide'); 


    } 
} 
}); 

Ext.reg('CategoryList', app.views.CategoryList); 

LocationModel.js

//The model will load the locations information you entered in the locations.xml file   after it has been fed through JSON 

//Register the Location Model 
Ext.regModel('Locations', { 
fields: [{name: 'post_title', type: 'string'}, 
     {name: 'post_type', type: 'string'}], 
belongsTo: 'Category' 
}); 
//Load XML data from JSON into local store 
app.stores.LocationsList = new Ext.data.Store({ 
model: "Locations", //Model to use for the Store 
/*filters: [ 
      { 
       property: 'post_type', 
       value: null 
      } 
     ],*/ 
sorters: [{ 
property: 'post_title', //Set the title as a sorter to the listing card can use the grouped list layout 
       direction: 'ASC' 
      }], 
proxy: { 
    type: 'ajax', //Load JSON from our source defined in the config file 
    url: HTTP_ROOT + '/' + JSON_SOURCE, 
    reader: { 
     type: 'json', 
     root: 'markers1' 
    }, 

    id : 'LocationsID' 
}, 
getGroupString : function(record) { 
    // return the first character of the address in order to group 
    return record.get('post_title')[0]; 
}, 

listeners: { 
    'load': function (t, r, s) { 
     //Fire custom event once all the load is complete 
     Ext.dispatch({ 
      controller: app.controllers.map, 
      action: 'loaded', 
      records: r 
     }); 
    }, 
}, 
    autoLoad : true //We start loading the info into the datastore immediately after the app is started to make it available ASAP 

}); 

CategoryModel.js

//The model will load the locations information you entered in the locations.xml file after it has been fed through JSON 

Ext.regModel('Category', { 
fields: [ 
{name: 'post_type', type: 'string'},], 
hasMany: { 
    model: 'Locations', 
    name : 'locations', 
    filterProperty: 'post_type' 
} 
}); 

var data = { 
"categories":[ 
{"post_type":"trails"}, 
{"post_type":"Adventure Guides"}, 
{"post_type":"brew"}, 
{"post_type":"Festivals and Races"}, 
{"post_type":"Paddle and Rafting"}, 
{"post_type":"Parks and Forests"}, 
{"post_type":"Campgrounds"}, 
{"post_type":"Rivers, Mountains, Lakes"} 
] 
}; 

//Load XML data from JSON into local store 
app.stores.CategoryList = new Ext.data.Store({ 
model: "Category", //Model to use for the Store 
data: data, 
sorters: [{ 
       property: 'post_type', //Set the title as a sorter to the listing card can use the grouped list layout 
       direction: 'ASC' 
      }], 
proxy: { 
    type: 'memory', //Load JSON from our source defined in the config file 
    //url: HTTP_ROOT + '/' + JSON_SOURCE, 
    reader: { 
     type: 'json', 
     root: 'categories' 
    }, 
    id : 'CategoryID' 
}, 
getGroupString : function(record) { 
    // return the first character of the address in order to group 
    return record.get('post_type')[0]; 
}, 

listeners: { 
    'load': function (t, r, s) { 
     //Fire custom event once all the load is complete 
     Ext.dispatch({ 
      controller: app.controllers.map, 
      action: 'loaded', 
      records: r 
     }); 
    }, 
}, 
autoLoad : true //We start loading the info into the datastore immediately after the app is started to make it available ASAP 

}); 

答えて

0

だからそれはあなたのように見えます私は今正式に錆びています。しかし、私はそれを撃つでしょう。リモートフィルタを使用する私の挑戦はいつも涙で終わったので、組み込みのフィルタメソッドを使用しようとするのではなく、自分自身を動かした。 YMMV。

ストアとストアのプロキシを取得し、getParamsオブジェクトを設定してgetパラメータに変換することができます。この方法でURLを変更することもできます。以前は、リモートでフィルタリングするためのカスタムセッタメソッドを作成しました。これは、touch1.1の組み込み関数よりもうまく機能しているように思えたからです。

あなたは店をつかむなどの方法にあなたのフィルタを渡したい:だからあなたのメインリストが最初に(フィルタリングされていない)ストアからレコードを検索するonitemtap使用するかのSelectionChangeすなわち

setFilterParams: function(param) { 
    var p = this.getProxy(); 
    p.extraParams = {filter_value: param}; 
    // p.url also works 
} 

... 
yourstore.load(); 

、その値をとり、詳細ページが使用するセカンドストアのsetFilterに適用されます。

あなたはあなたがnewbだと言ったので、また注意してください。これらのストアはシングルトンを表します。したがって、同じストアを使用する2つのリストがある場合、list1がlist2に影響するストア上のデータをフィルタリングする場合。あなたが必要なものをやって行く方法をここで

0

だ煎茶タッチ1.

//モデル

App.models.States = Ext.regModel('State', { 
    idProperty : 'stateId', 
    fields : [ 
    { name : 'stateId', type : 'integer'}, 
    { name : 'state', type : 'string'} 
    ] 
}); 

App.models.Districts = Ext.regModel('District', { 
    fields : [ 
    { name : 'districtId', type : 'integer'}, 
    { name : 'stateId', type : 'integer'}, 
    { name : 'district', type : 'string'} 
    ] 
}); 

//店舗

App.stores.StatesStore = new Ext.data.Store({ 
    model : 'State', 
    data : [ 
    { stateId : 1, state : 'Maharashtra' }, 
    { stateId : 2, state : 'Andhra Pradesh' } 
    ], 
    sorters : 'state', 
    autoLoad : true 
}); 

App.stores.DistrictStore = new Ext.data.Store({ 
    model : 'State', 
    data : [ 
    { districtId : 1, district : 'Nasik', stateId : 1 }, 
    { districtId : 2, district : 'Thane', stateId : 1 }, 
    { districtId : 3, district : 'Jalgaon', stateId : 1 }, 
    { districtId : 4, district : 'Hyderabad', stateId : 2 }, 
    { districtId : 5, district : 'Nizamabad', stateId : 2 }, 
    { districtId : 6, district : 'Kurnool', stateId : 2 } 
    ], 
    sorters : 'district', 
    autoload : true 
}); 

I(フィルタリングの2つのレベルのため)ここにデータをインラインで読み込んで、どのように関連付けられているかを確認できます。各地区のIDは現在、州のIDと関連付けられています。たとえば、ナシク地区は、マハラシュトラ州の中に存在します。したがって、 'Nasik'のdistrictID 1は 'Maharashtra'のstateId 1に関連付けられています。国のためにSelectfield &地区

{ 
xtype: 'selectfield', 
name : 'state', 
id : 'state', 
label: 'State', 
store : App.stores.StatesStore, 
displayField : 'state', 
valueField : 'stateId', 
listeners : { 
    change : function(t, value){ 
     Ext.dispatch({ 
      controller : 'Users', 
      action : 'filterLocations', 
      data : {value:value, level : 'district'} 
     }); 
    } 
} 
}, 
{ 
    xtype: 'selectfield', 
    name : 'district', 
    id : 'district', 
    label: 'District', 
    store : App.stores.DistrictStore, 
    displayField : 'district', 
    valueField : 'districtId' 
} 

については

//今selectfieldsは、我々が以前に作成したモデル/店舗と関連しています。

状態の選択フィールドが変更されたときに呼び出されるコントローラ関数を見ていきます。

filterLocations: function(params){ 
    var value = params.data.value; 
    var level = params.data.level; 

    if(level == "district"){ 
     App.stores.DistrictStore.clearFilter(); 
     App.stores.DistrictStore.filter('stateId', value); 
     var firstValue = Ext.getCmp('district').store.getAt(0); 
     if(firstValue) Ext.getCmp('district').setValue('Select District'); 
    } 
    else if(level == "block"){ 
     App.stores.BlockStore.clearFilter(); 
     App.stores.BlockStore.filter('districtId', value); 
     var firstValue = Ext.getCmp('block').store.getAt(0); 
     if(firstValue) Ext.getCmp('block').setValue('Select Block'); 
    } 
}, 

複数のレベルをサポートできる拡張コントローラが用意されています。たとえば、州はフィルターをかけることになり、地区は村などを絞り込むことができます。そのため、コントローラーではフィルタリングが必要なレベルを取っています。州と地方の間でフィルタリングを行う場合、最初の条件が呼び出され、地区ストア(したがってセレクトフィールド)がフィルタリングされて目的の値が得られます。

+0

このモデル/ストア/コントローラの概念をSencha Touch 2にも拡張できます。私はすぐに私の準備ができていませんが、それは比較的簡単に行うべきです。 – SashaZd