Внутри выражения knockout.js я могу использовать $data
, $parent
и $root
псевдовариантность. Как я могу получить эквивалент этих псевдовариабелей, когда я использую ko.computed
наблюдаемый, объявленный в JavaScript?
У меня есть родительская viewmodel с набором дочерних элементов, а родительская модель просмотра имеет selectedChild
наблюдаемую. Учитывая это, я могу использовать выражения для привязки данных, чтобы добавить класс CSS к тому, какой выбран выбранный ребенок:
<ul data-bind="foreach: children">
<li data-bind="text: name,
css: {selected: $data === $root.selectedChild()},
click: $root.selectChild"></li>
</ul>
<script>
vm = {
selectedChild: ko.observable(),
children: [{name: 'Bob'}, {name: 'Ned'}],
selectChild: function(child) { vm.selectedChild(child); }
};
ko.applyBindings(vm);
</script>
Но мои модели просмотра будут более сложными, и мне бы хотелось, чтобы я был выбран? чтобы иметь возможность делать больше, чем просто добавлять один класс CSS к одному элементу. Я действительно хочу сделать вычисленное свойство isSelected
на дочерней модели, поэтому я могу добавить другие рассчитанные свойства, которые зависят от него.
Я пробовал просто писать JavaScript, который ссылается на $data
и $root
, на случай, если нокаут может определить эти переменные и каким-то образом их охватить, когда он вызовет мою функцию оценщика computed
:
{
name: 'Bob',
isSelected: ko.computed(function(){ return $data === $root.selectedChild(); })
}
Но нет такой удачи: внутри моего оценщика function
оба $data
и $root
являются undefined
.
Я также попытался использовать ko.contextFor
внутри моего оценщика, так как он дает доступ к $data
и $root
. К сожалению, внутри моей функции оценщика contextFor
также всегда возвращает undefined
. (В любом случае, я не возлагал большие надежды на эту стратегию - неясно, насколько хорошо нокаут сможет отслеживать зависимости, если бы мне пришлось заходить так за спиной.)
Я всегда мог вручную установить свойство на каждой дочерней модели просмотра, которая ссылается на родительскую модель. Но я знаю, что у нокаута есть возможность сделать это для меня, и я хотел бы хотя бы выяснить, могу ли я использовать его механизмы, прежде чем я начну писать свои собственные.
Кажется, что должно быть возможно перевести указанное выражение привязки к вычисленному наблюдаемому - в конце концов, что уже делает нокаут:
Другой опрятный трюк заключается в том, что декларативные привязки просто реализуются как вычисленные наблюдаемые.
Но как мне поступить с псевдокаруамами $data
и $root
, когда я пишу свои собственные вычисленные наблюдаемые?