Могу ли я получить доступ к сервисным переменным ember во всем приложении? - PullRequest
0 голосов
/ 20 марта 2019

Я создал службу ember и инициализировал ее значение, теперь я обновил это значение в контроллере.Я хочу эту обновленную переменную в моем полном приложении?Что я должен делать?Любая помощь будет оценена.Спасибо

Ответы [ 3 ]

1 голос
/ 21 марта 2019

Пожалуйста, посмотрите на эту статью из путеводителя ember https://guides.emberjs.com/release/components/triggering-changes-with-actions/#toc_invoking-actions-directly-on-component-collaborators

Вы сделали правильную вещь, как только вы уже установили обновленное значение этой переменной в вашем сервисе, это значение будет таким же, пока вы не проинструктироваликод для изменения значения этой переменной.Чтобы ответить на ваш вопрос, Can i access ember service variables in my whole application? Да, вы можете сделать следующее, чтобы получить доступ к переменной в вашем приложении.

Предполагая, что это ваша переменная и имя службы //services/current-session.js

import Service from '@ember/service';


export default Service.extend({
  foo: 'foo bar baz',
});

Если вы хотите получить к нему доступ в своем controller, сделайте следующее

import Controller from '@ember/controller';
import { computed } from '@ember/object';
import { inject as injectService } from '@ember/service';

export default Controller.extend({
  currentSession: injectService(),

  bar: computed('currentSession.foo', function() {
    return this.currentSession.foo;
  }),
});

Если вы хотите получить к нему доступ в своем компоненте

import Component from '@ember/component';
import { computed } from '@ember/object';
import { inject as injectService } from '@ember/service';

export default Component.extend({
  currentSession: injectService(),

  bar: computed('currentSession.foo', function() {
    return this.currentSession.foo;
  }),
});

Подход, описанный выше, основан на угасающем клике 3.4 Вот угасший твиддл, с которым вы можете поиграть.https://ember -twiddle.com/b92a7d4fa03a1699a5b8a79aca5d2782? OpenFiles = controllers.application.js% 2C

Если вы хотите изменить значение вашей переменной в вашей службе через контроллер, вы можете сделать этоэто

import Controller from '@ember/controller';
import { set } from '@ember/object';
import { inject as injectService } from '@ember/service';

export default Controller.extend({
  currentSession: injectService(),

  actions: {
    change() {
      this.currentSession.set('foo', 'foo bar baz please');
    }
  }
});
1 голос
/ 20 марта 2019

Просто дурацкий пример

  • Услуги
// header.js

import Service from '@ember/service';

export default Service.extend({
  currentRoute: null
});
  • Маршрут
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
import { set } from '@ember/object';

export default Route.extend({
  header: service(),

  beforeModel() {
    set(this, 'header.currentRoute', 'login');
  }
});
  • Любой контроллер
import Controller from '@ember/controller';
import { computed, get } from '@ember/object';
import { inject as service } from '@ember/service';

export default Controller.extend({
  header: service(),

  currentRoute: computed('header.currentRoute', function() {
    return get(this, 'header.currentRoute');
  })
});

Надеюсь, вы поняли идею

0 голосов
/ 20 марта 2019

работает тиддл .

Шаги:

1) создать сервис:

app/services/service-name.js

import Service from '@ember/service';

export default Service.extend({
  name: "hello",
  changeName(name) {
    this.set('name', name);
  }
});

2) Создайте инициализатор, чтобы вам не приходилось вводить службу в каждый маршрут / контроллер / компонент.

app/initializers/inject-service-name.js

export function initialize(application) {
  application.inject('controller', 'serviceName', 'service:service-name');
  // if needed
  // application.inject('route', 'serviceName', 'service:service-name');
  // application.inject('component', 'serviceName', 'service:service-name');
}

export default {
  initialize
};

после создания инициализатора любезно restart ваш сервер ember.

3) Использование:

app/controller/application.js

import Controller from '@ember/controller';

export default Controller.extend({
  init() {
    this._super(...arguments);
    // print initial value
    console.log(this.get('serviceName').name); // hello
    // change value of name property in service
    this.get('serviceName').changeName("hai");
    // print changed value
    console.log(this.get('serviceName').name); // hai
  }
});

...