Ember.js — Как правильно позвонить в магазин с контроллера?

#javascript #ember.js

#javascript #ember.js

Вопрос:

итак, я пытаюсь получить доступ к хранилищу с контроллера следующим образом:

 import Ember from 'ember';

export default Ember.Controller.extend({
  emailAddress: '',
  message: '',

  isValidEmail: Ember.computed.match('emailAddress', /^. @. .. $/),
  isMessageLongEnough: Ember.computed.gte('message.length', 10),

  isValid: Ember.computed.and('isValidEmail', 'isMessageLongEnough'),
  isNotValid: Ember.computed.not('isValid'),

  actions: {

    sendConfirmation() {
      this.store.createRecord('contact', {
        email: emailAddress,
        message: message,
      }).save();

      this.set('responseMessage', 'We got your message and we will be in contact soon :)');
      this.set('emailAddress', '');
      this.set('message', '');
    }
  }

});
 

Я просмотрел документацию для Ember.js 2.7 и в нем конкретно не указано, где можно получить доступ к хранилищу, но я знаю, что к нему можно получить доступ через контроллер или маршрут.

Однако выполнение этого способа приводит к следующим ошибкам:

 controllers/contact.js: line 17, col 16, 'emailAddress' is not defined.
controllers/contact.js: line 18, col 18, 'message' is not defined.
 

Я не уверен, так ли я обращаюсь к контроллеру или так, как я определил адрес электронной почты и сообщение.

Пожалуйста, помогите и спасибо!

РЕШАЕМАЯ: для этой части:

 sendConfirmation() {
    this.store.createRecord('contact', {
    email: emailAddress,
    message: message,
 }).save();
 

Это должно было быть так:

 sendConfirmation() {
    this.store.createRecord('contact', {
    email: this.get('emailAddress'),
    message: this.get('message'),
  }).save();
 

🙂

Ответ №1:

Ваша проблема не в том, как вы получаете доступ к хранилищу, а в том, что вы пытаетесь добавить контакт с электронной почтой и сообщением, фактически не определяя переменные.

 sendConfirmation() {
  this.store.createRecord('contact', {
    // what do you expect emailAddress and message values to be at this point?
    email: emailAddress, // <-- emailAddress is not defined
    message: message,    // <-- message is not defined
  }).save();
  // ...
 

Возможно, вы хотели сначала получить их?

 sendConfirmation() {
  // retrieve emailAddress and message first
  const { 
    emailAddress, 
    message 
  } = this.getProperties('emailAddress', 'message');

  // then use them to create a contact
  this.store.createRecord('contact', {
    email: emailAddress
    message: message
  }).save();
  // ...
 

Еще одна вещь, доступ к хранилищу, вероятно, следует осуществлять с помощью this.get('store') , поскольку использование геттеров / сеттеров — это способ доступа к свойствам ember / управления ими.

Ответ №2:

По умолчанию store будет введено в controller и route . и еще одна вещь, через которую вы должны получить свойства get

 sendConfirmation() {
    var newRecordObj = {};
    newRecordObj['email'] = this.get('emailAddress');
    newRecordObj['message'] = this.get('message');

    this.get('store').createRecord('contact', newRecordObj).save((result) => {
        //success handling 
        this.set('responseMessage', 'We got your message and we will be in contact soon :)');
        this.set('emailAddress', '');
        this.set('message', '');
    }, () => {
        //error handling
        this.set('responseMessage', 'Error message');
    });
}