Наблюдение за свойством контроллера (участвующим в queryparam) из службы без наблюдателя

Я переместил свойства состояния из контроллера в службу, кроме 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');
    }
  }
});

templates/application.hbs

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

services/my-service.js

import Ember from 'ember';

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

EmberTwiddle


person Ember Freak    schedule 14.08.2016    source источник


Ответы (1)


Зачем вообще нужен наблюдатель? Просто установите appName службы непосредственно внутри вашего действия changeApp контроллера: this.set('myService.appName','Kumkanillam'); и полностью удалите наблюдателя.

Ваш вопрос стал sth. отличается после вашего комментария. Позвольте мне уточнить, правильно ли я понимаю ваш вопрос, со следующим крутить. В таком случае; вы изменяете appName как на контроллере, так и на компоненте; что является иллюстрацией нарушения принципа DDAU. В этой ситуации вам нужен наблюдатель внутри контроллера, чтобы получать уведомления об изменении appName на уровне компонента.

Чтобы решить эту проблему; вы можете создать вычисляемое свойство с псевдонимом на уровне контроллера и передать его компоненту (или другим компонентам или шаблонам маршрута), и вы избавитесь от наблюдателя. Этот twiddle объясняет, что я имею в виду.

Даже если то, что я понял, правильно и то, что я предоставил, может быть действительным ответом; не забывайте, что нарушение DDAU в какой-то момент навредит вам, и в будущем вам придется рефакторить свой код. Надеюсь это поможет.

person feanor07    schedule 14.08.2016
comment
Мне известно о настройке свойств службы с контроллера. во многих местах, где я меняю свойство appName, чтобы избежать повторного кода установки свойства службы, мне требуется некоторый механизм, который автоматически позаботится о связывании свойства контроллера appName со службой. В настоящее время я не следовал принципу DDAU, поэтому это свойство может быть изменено в много других мест... - person Ember Freak; 15.08.2016
comment
Я изменил ответ после прочтения вашего комментария; так как ваша проблема отличается от того, что я понял в начале. - person feanor07; 15.08.2016
comment
Поэтому я не должен менять appName непосредственно в контроллере, я всегда должен заходить через сервисы. я прав ? - person Ember Freak; 15.08.2016
comment
ИМХО, изменять его должен только владелец данных. В твоем случае; если appName принадлежит контроллеру; только контроллер должен изменить его. Если он принадлежит службе; его следует изменять только через общедоступный интерфейс службы. В первом повороте я обеспечил; appName изменяется в двух местах (контроллер и компонент); поэтому нам нужен наблюдатель. Я предпочитаю предоставлять общую функциональность через сервисы и хранить межсекторальные данные приложений внутри сервисов. Поэтому заявлять, что в контроллерах ничего не должно меняться и что каждое изменение должно проходить через сервисы, слишком амбициозно. - person feanor07; 15.08.2016