Обновление 2
Итак, я столкнулся с этой проблемой на github . В одном из ответов указывалось, что передача наблюдаемого объекта в метод автоматически делает метод наблюдаемым. В настоящее время вы только передаете person
в isSelected()
. Но человек не меняется. Я думаю, что вы можете выполнить то, что вы ищете, изменив свой метод isSelected()
следующим образом (обратите внимание на изменение вызова isSelected в привязке класса кнопки):
vm.ts
public isSelected(person, length){
return this.selections.find(item => item.name === person.name);
}
view.html
<button
class="btn-gradient mini ${isSelected(person, selections.length) ? 'green': 'red'}"
click.delegate="selectPerson(person)"
repeat.for="person of people">
${person.name}
</button>
Пример: https://codesandbox.io/s/aurelia-typescript-sandbox-oelt7?fontsize=14
Исходное сообщение
Я борюсь с той же проблемой, пытаясь реализовать метод isSelected()
для управления выбранным классом индикатора. Я изучил @computedFrom
.
Я могу ошибаться, но из того, что я видел, @computedFrom
можно использовать только с непараматизированными геттерами.
@computedFrom('firstName', 'lastName')
get fullName() { return `${firstName} ${lastName}`}
Итак, проблема с тем, что мы хотим сделать, заключается в том, что нам нужно передать индекс или элемент в наш метод, что лишает нас возможности использовать @computedFrom
.
Альтернативу, которую яне очень нравится ... но это работает , это значит добавить свойство isSelected
к каждому из ваших личных объектов. Тогда ваш код будет выглядеть примерно так:
vm.ts
selectPerson(person){
person.isSelected = !person.isSelected; //De-selects if already selected
}
view.html
<button
class="btn-gradient mini ${person.isSelected ? 'green': 'red'}"
click.delegate="selectPerson(person)"
repeat.for="person of people">${person.name}</button>
(или, как мне недавно предложили, оберните ваш объект person в класс-оболочку)
public class SelectableWrapper {
constructor(public person : Person, public isSelected : boolean){}
}
Обновление 1
Для решения проблемы отображенияСписок выбранных элементов (а также «раскраска» выбранных элементов) можно сделать следующим образом (в дополнение к тому, что я уже показал):
vm.ts
//Remove selections property and add it as a getter
get selections(){
return this.people.filter(p => p.isSelected);
}
view.html
<div repeat.for = "person of selections">
${person.name}
</div>
Пример здесь: https://codesandbox.io/s/aurelia-typescript-sandbox-u92nk?fontsize=14