2015-06-19 46 views
2

我現在有大量查詢參數到一個路由,並且我有一個駐留在路由模板中的組件。將查詢參數傳遞到組件EmberJS

我想我的查詢參數,以獲得在該組件內部的變化更新,所以我在查詢參數通過組件傳似:

{{comp-name query_param1=query_param1 ... query_param=query_param20 }}

我目前更新與組件的查詢參數:

{{input value=query_param_x}}

不過,這很快變得單調乏味,而且普遍只要我將傳遞20個參數。有沒有辦法讓這個更簡潔?

注意:我正在開發的應用程序在Ember 1.12上,並未使用ember-data。

+0

我似乎記得EmberLand(播客)的最新一集說你需要堅持瓦特/控制器,如果你在1使用queryParams。 x當前 –

回答

1

您可以創建一個包含所有PARAMS的對象,類似這樣的東西:

params = { 
    query_param1, 
    query_param2, 
    ... 
} 

傳入params對象,而不是每一個人PARAM:

{{comp-name params=params}} 

另外,再想想如果組件真的需要那麼多參數。是否有辦法將其分解爲不太複雜,較小的組件等等。

+0

在組件中更改時,查詢參數實際上是否與控制器中的查詢參數同步更新?你需要觀察所有的查詢參數,而不是將它填充到一個對象中嗎? –

1

另一種方法是不在組件與其主機控制器/路由器之間共享queryParameters。將查詢行爲的組件與路由的查詢行爲分開。你不需要這些東西進行交互。組件不需要與父級共享查詢參數。我想你想分享的是DS.Store的一個實例。

通過傳遞給商店的參考(使用服務暴露它的渴望Emberinos的積分),可以爲獨立於路由器的組件執行查詢。通過這種方式,商店可以優先處理/編組請求。

這是一個實現此模式的mixin示例。 store只是傳遞到組件從控制器通過以下方式:{{foo store=store}}

Ember.Mixin.Create({ 
    actions: { 
    // @params q Hash 
    query(q){ 
    // #beforeModel just imitates the semantics of the route events 
    let [store,query] = [this.get('store'),this.beforeModel(q)]; 
    let p = store.query(query).then(function(results){ 
     this.set('results', this.afterModel(query, results)); 
     this.rerender(); 
    }.bind(this)).catch(function(error){ 
     this.handleError(error); 
     this.rerender(); 
    }.bind(this)); 
    this.set('p', p); // P observers fire as it transitions 
    } 
}) 
+1

嗨@htmldrum - 只是代碼格式化的提示:不是使用反引號,而是突出顯示代碼並按下ctrl-k。這樣它得到語法高亮:) – Rob