Внутри выражения 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, когда я пишу свои собственные вычисленные наблюдаемые?