Как сохранить входное значение EmberJS в объекте или массиве на контроллере
У меня есть несколько полей ввода, которые отображаются программно через каждого помощника Ember. Эти входные данные связаны с данными, возвращаемыми из моей базы данных, и у меня есть соответствующий уникальный идентификатор для каждого входа, который я мог бы использовать при необходимости.
У меня вопрос, как я могу сохранить значение этих динамически генерируемых входов на моем контроллере, чтобы я мог получить доступ к входным данным пользователя? Я пытался сделать что-то вроде этого:
{{#each solutionTypes as |solutionType|}}
{{input value=inputData[solutionType.id]}}
{{/each}}
Однако попытка получить доступ к объекту или массиву таким образом вызывает ошибку сборки, связанную с приведенным выше синтаксисом при указании значения (запись точки объекта также вызывает ошибку сборки).
Короче говоря, я пытаюсь сохранить значение поля ввода в виде свойства объекта или в массиве, а не в виде простой переменной на контроллере. Я хотел бы, чтобы входные данные из всех входных данных в форме были доступны из переменной "inputData" в следующей форме:
{
"1000": "data from first input",
"1001": "data from second input",
"1002": "data from third input"
}
Основная проблема заключается в использовании динамических ключей (из solutionType.id) в коде руля без получения ошибки сборки.
Если это невозможно с помощью атрибута значения, но вы знаете, как этого добиться с помощью действий или чего-то еще, я более чем открыт для ваших идей.
2 ответа
Вопрос немного запутанный, поэтому я отвечу обоими способами, как я интерпретировал ваш вопрос.
Двухстороннее связывание
{{input}}
helper устанавливает двухстороннее связывание со значением, поэтому в вашем примере:
{{input value=solutionType.value}}
будет связывать solutionType.value
на вход. Он не только отображает это значение, но и означает, что когда пользователь вводит данные, он будет обновлять solutionType.value
,
Односторонние привязки (Действия при отключении данных вверх)
На основании вашего использования inputData
быть другим тогда solutionType
Я предполагаю, что вы хотите одностороннюю привязку.
Стандарт сообщества заключается в использовании Data Down Actions Up таким образом, чтобы solutionType.value
не изменяется, когда пользователь вводит данные, но вместо этого отправляет действие обратно, чтобы вы могли управлять им по своему усмотрению.
К сожалению нынешний Ember {{input}}
Помощник не поддерживает это. Существует дополнение под названием https://github.com/DockYard/ember-one-way-controls, которое сделает это за вас. Вы можете поэкспериментировать с этим.
Предостережение с приведенным выше дополнением заключается в том, что вам придется управлять solutionTypes
данные вручную, поскольку действия возвращаются.
В конечном итоге вам нужно будет решить, насколько тесно связаны данные, которые вы отображаете через поле ввода, с данными, которые, как вы ожидаете, пользователь будет печатать и соответствующим образом корректировать ваш дизайн.
Да. Вы можете использовать динамические ключи (от solutionType.id
) в коде руля без получения ошибки сборки с помощью get
а также mut
помощник это возможно. уголек-вертеть
Для двухстороннего связывания,
{{input value=(mut (get inputData (get solutionType 'id'))) }}
Для одностороннего связывания,
{{input value=(get inputData (get solutionType 'id')) }}
маршруты /application.js
import Ember from 'ember';
export default Ember.Route.extend({
model(){
return [{id:'1000'},{id:'1001'},{id:'1002'}];
},
setupController(controller,model){
this._super(...arguments);
controller.set('solutionTypes',model);
}
});
Контроллеры /application.js
import Ember from 'ember';
export default Ember.Controller.extend({
appName: 'Ember Twiddle',
inputData:{'1000': "data from first input", '1001': "data from second input",'1002': "data from third input"},
});
шаблоны /application.hbs
<h1>Welcome to {{appName}}</h1>
<br>
<h1> One way binding </h1>
{{#each solutionTypes as |solutionType|}}
{{input value=(get inputData (get solutionType 'id')) }}
{{/each}}
<h2> Two way binding </h2>
{{#each solutionTypes as |solutionType|}}
{{input value=(mut (get inputData (get solutionType 'id'))) }}
{{/each}}
<br>
<h2> Result </h2>
{{#each solutionTypes as |solutionType|}}
<span> {{get inputData (get solutionType 'id')}} </span>
{{/each}}
<br />
{{outlet}}
<br>
<br>