2016-08-14 54 views
0

我把狀態屬性從控制器移動到服務,除了queryParams。現在我想有一個查詢參數屬性來服務。
有沒有辦法在不使用觀察者的情況下實現這一點?觀察控制器屬性(參與查詢參數)從服務沒有觀察員

我目前正在使用觀察者。

控制器/ application.js中

import Ember from 'ember'; 
const {computed,observer} = Ember; 
export default Ember.Controller.extend({ 
    myService:Ember.inject.service(), 
    appName: 'Ember Twiddle', 
    changedAppName:observer('appName',function(){ 
    this.get('myService').changeAppName(this.get('appName')); 
    }), 
    actions:{ 
    changeApp(){ 
     this.set('appName','NewEmberApp'); 
    } 
    } 
}); 

模板/ application.hbs

<h1>Welcome to {{myService.appName}}</h1> 
<br> 
<button {{action "changeApp"}}>Change</button> 
<br> 
{{outlet}} 
<br> 
<br> 

服務/ MY-service.js

import Ember from 'ember'; 

export default Ember.Service.extend({ 
    appName:'SSS', 
    changeAppName(param){ 
    this.set('appName',param); 
    } 
}); 

EmberTwiddle

回答

1

爲什麼你需要觀察者呢?只需在控制器的changeApp操作中直接設置服務的appName:this.set('myService.appName','Kumkanillam'); 並完全移除觀察者。

你的問題變成了......。您的評論後不同。讓我澄清一下,如果我正確理解您的問題,請使用以下twiddle。在這種情況下;您正在控制器和組件處修改appName;這是違反DDAU原則的一個例證。在這種情況下,您需要控制器內的觀察者才能在組件級別收到有關appName更改的通知。

爲了解決這個問題,您可以在控制器級別創建別名計算屬性並將其傳遞給組件(或其他組件或路由模板),您將擺脫觀察者。這twiddle解釋我的意思。

即使我的理解是正確的,我所提供的可能是一個有效的答案;不要忘記,違反DDAU會在某些時候傷害你,你將不得不在未來重構你的代碼。希望這可以幫助。

+0

我知道從控制器設置服務屬性。很多地方我改變appName屬性,以避免重複設置服務屬性的代碼我需要一些機制,將自動照顧關聯appName控制器屬性service.Currently我沒有遵循DDAU的原則,所以這個屬性可能會改變許多其他地方... – kumkanillam

+0

我在閱讀您的評論後修改了答案;因爲你的問題與我在開始時所理解的不同。 – alptugd

+0

所以我不應該直接在控制器中更改'appName',我應該總是通過服務來完成。我對嗎 ? – kumkanillam