2016-09-16 5 views
1

このアプリケーションをフィルタリングできるリストが含まれているページがあります。クエリパラメータの削除とrefreshModel

リストの背後にあるデータは非常に大きくなる可能性があるため、JSONAPIリファレンス(例:?filter[name]=John&filter[date]=2016-09-12|2016-09-15)によく似たフィルタパラメータを送信することで、フィルタリングがサーバー側で行われます。

次のようにそれを行うためには、私は私のルートを設定している:

ルートを作る
export default Ember.Route.extend(AuthenticatedRoute, { 
    queryParams: { 
    'filter[name]': { 
     refreshModel: true 
    }, 
    [...] 
    }, 

    model(params) { 
    return this.store.query('receipt', params); 
    } 
}); 

は何の問題もなくAPI呼び出しにそのクエリパラメータをコピーします。

もちろん、ユーザーは自分のインターフェイスからフィルタを変更できる必要があります。だから私は少しブートストラップモーダル/フォームを作って、クエリパラメータのセットを構築し、彼らとのルートを再ロードし、私のコントローラ内のアクションとそれをフックアップ:

changeFilters() { 
    var params = {}; 
    if (this.get('nameFilter')) { 
    params['filter[name]'] = this.get('nameFilter'); 
    } 
    [...] 
    this.transitionToRoute({queryParams: params}); 
} 

が、これは実際には正常に動作しない行います。クエリでfilter[name]パラメータが追加または変更されると、ルートが更新され、モデルが更新されます。ただし、ユーザーがフィルタを無効にすると問題が発生します。クエリパラメータを削除しても、refreshModelがtrueに設定されていてもルートが更新されないようです。

私には分かりませんが、バグであることは間違いないと思いますが、その間に私はEmberにとってかなり新しいので、バグレポートを提出する前にここで助けを求めると思っていました。

私には何かがありますか?またはこれは設計/何らかの設計上の制限ですか?

ありがとうございます!

+1

代わりに削除するだけで、デフォルト値の空の '' ''に設定されます。これは、私がqueryParamsのためにやっている方法を再読み込みします。 – kumkanillam

+0

ああ、これまでにやったことですが、パラメータが削除されず、 'refreshModel'がリフレッシュを起動しますが、それはあまり最適ではありません。 (醜いURLを除いて)現時点では大きな問題ではありませんが、空の文字列は実際には未定義/空文字列と同じではなく、特定のフィールドで問題になることがあります。例えばVAT番号の場合、 'filter [vat] ='はVAT番号のない領収書だけをフィルタリングしますが、フィルタリングを完全に無効にしたいと考えています。 – blue

+1

@blueこの問題:https://github.com/emberjs/ember.js/issues/10577が役に立ちますか?クエリパラメータは本当に面倒です。これがバグかどうか分かりません。回避策として、あなたのコントローラからアクションを送信して、あなたのルートでリフレッシュをトリガすることができます:http://emberjs.com/api/classes/Ember.Route.html#method_refresh –

答えて

1

transitionToRouteを使用する代わりに、コントローラのバインディングを使用してクエリパラメータを更新するとどうなりますか?

は、コードは次のようになります。

export default Ember.Controller.extend({ 

    queryParams: { 
    'filter[name]': { 
     refreshModel: true 
    }, 
    }, 

}); 

changeFilters() { 
    var params = {}; 
    if (this.get('nameFilter')) { 
    this.set('filter[name]', this.get('nameFilter')); 
    } 
    [...] 
} 

私はこれがうまくいくかどうかわからないんだけど、あなたはそれに打撃を与えることができます。

+0

この問題は、コントローラーの属性を変更してもURLが変更されず、クライアントがURLを他のフィルターと共有できるようにしたいという問題があります。たぶん、ある種のハイブリッドが使えるかもしれませんが、コントローラーの 'filter [name]'属性を設定すると自動的にルートに設定されるとは思いません。 – blue

+0

@blueガイドでは、コントローラの属性を変更するとURLが更新されます:https://guides.emberjs.com/v2.8.0/routing/query-params/#toc_specifying-query-parameters - "... URLのカテゴリクエリのパラメータを変更すると、controller:articlesのcategoryプロパティが更新され、その逆も同様です。 –

+0

まあまあ、それは完璧です!どうもありがとう! – blue

関連する問題