Поскольку вы используете два шаблона параллельно (а не в отношении «родитель-потомок»), вы можете использовать ReactiveVar
для кэширования текущего выбранного имени клиента:
const selectedCustomer = new ReactiveVar()
Обратите внимание, что он должен быть доступен для обоих шаблонов. Либо вы объявляете его обоими шаблонами в одном файле, либо используете import
/ export
для предоставления доступа ко многим файлам.
Теперь вашим клиентам select
необходимо назначить value
каждому option
, чтобы мы могли его кэшировать при изменении выбора:
<template name="selectClient">
Client Name :
<select class="select-customer">
<option selected disabled>Choose client name</option>
{{#each custom}}
<option value="clientName" selected="{{#if selectedClient clientName}}selected{{/if}}">{{clientName}}</option>
{{/each}}
</select>
</template>
Я переименовал его в класс, чтобы избежать путаницы в именах, в select-customter
. Заметили код {{#if selectedClient}}...
? Мы будем использовать помощника для восстановления последнего выбранного состояния в раскрывающемся списке. В противном случае ваш выпадающий список будет сброшен при следующем цикле рендеринга:
Template.selectClient.helpers({
'custom': function(){
return Customers.find();
},
selectedClient(name) {
const selected = selectedCustomer.get()
return selected && selected.clientName === name
}
});
Мы получаем выбранного клиента из кэша и проверяем, совпадает ли значение текущей опции. Если true, мы можем пометить опцию как selected
.
Теперь вам все еще нужно событие, которое охватывает выбранного клиента:
Template.selectClient.events({
'change .select'(event, templateInstance) {
// get the value using jQuery
const value = templateInstance.$(event.currentTarget).val()
// update the ReactiveVar
selectedCustomer.set({ clientName: value })
}
})
Сохраняет выбранное значение (в настоящее время clientName
) в формате запроса. Теперь в ваших адресах вам просто нужно запросить все Adresses
документы с использованием выбранного кэшированного клиента:
Template.selectAddress.helpers({
'address': function(){
const query = selectedCustomer.get() || {}
return Addresses.find(query);
}
});
Если клиент выбран, он будет отправлять запрос как сервер, в противном случае будут возвращены все адреса.
Хорошо, что этот ReactiveVar
уже предоставляет вам возможность инициировать новый цикл рендеринга, если он обновляется, поскольку код ваших помощников полагается на него, и Blaze автоматически разрешает это для вас.
Modificatopns
В этом коде предполагается, что Adresses
имеет отношение к Customers
в поле с именем clientName
. Если вы сохранили отношение с помощью других полей, таких как _id
- clientId
, вам необходимо соответствующим образом изменить код.
Вы также можете скрыть второй раскрывающийся список и отображать его, только если в selectedCustomer
.
есть значение.