(я знаю, что название это не самый лучший - не стесняйтесь редактировать)
Я следующие Knockout.js просмотра модели:
function Bar() {
var self = this;
self.baz = "baz";
}
function Foo() {
var self = this;
self.bars = ko.observableArray([]);
self.addBar = function() { self.bars.push(new Bar()); };
self.removeBar = function (bar) { self.bars.remove(bar); };
}
function ViewModel() {
var self = this;
self.foo = new Foo();
}
ko.applyBindings(new ViewModel());
И следующий HTML:
<a href="#" data-bind="click: foo.addBar">Add</a>
<ul data-bind="foreach: foo.bars">
<li><span data-bind="text: baz"></span> <a href="#" data-bind="click: $root.foo.removeBar">Remove</a></li>
</ul>
Это работает, как ожидалось. Но если изменить абсолютный путь к $root.foo.removeBar
$parent.removeBar
так:
<a href="#" data-bind="click: $parent.removeBar">Remove</a>
удаления элемента перестает работать; однако я не вижу никаких ошибок на консоли.
С некоторым экспериментированием, я мог бы узнать, что $parent
здесь относится к текущему элементу в наблюдаемом массиве (а Bar
экземпляра), не содержащий объект (Foo
экземпляра).
Мой вопрос: Как я могу ссылаться на содержащий объект, используя относительную ссылку в моих привязках?
EDIT: Я нашел способ, который работает:
<!-- ko with: foo -->
<ul data-bind="foreach: bars">
<li>
<span data-bind="text: baz"></span>
<a href="#" data-bind="click: $parent.removeBar">Remove</a>
</li>
</ul>
<!-- /ko -->
Это не красиво, но это работает. Это в основном сводится к открытию новой области для имущества foo
до foreach
.
Так что мой следующий вопрос: есть ли лучший способ сделать это?
Спасибо @JasonSpake, отличное объяснение! Мой фактический прецедент действительно намного сложнее, и важно не зависеть от полного пути к свойствам (я использую различные вспомогательные функции, которые генерируют части HTML). –