Utknąłem z tym, co musi być prostą poprawką. Używam knockout.js z zagnieżdżonymi modelami widoku i wszystko wydaje się w porządku, z tym wyjątkiem, że moja funkcja usuwania nie działa poprawnie. Wygląda na to, że jest prawidłowo wiążący, jednak nie jest uruchamiany, gdy kliknę usuń.Model widoku zagnieżdżonego zagnieżdżonego
Dlaczego modele widoku zagnieżdżonego? Długa historia, ale w zasadzie wiele rzeczy jest wymaganych na jednej stronie!
Tak oto kod:
HTML
<section class="mini-form-container">
<form data-bind="submit: repeatGuest.addDate">
<input type="date" data-bind="value: repeatGuest.previousStay"/>
<button type="submit" class="button-secondary ">Add date</button>
</form>
<div data-bind="foreach: repeatGuest.dates, visible: repeatGuest.dates().length > 0">
<div>
<input data-bind="value: date" disabled="disabled" />
<a data-bind="click: $parent.removeDate">Remove</a>
</div>
</div>
</section>
<section>
<div data-bind="text: ko.toJSON($data)"></div>
</section>
JavaScript
function RepeatGuest() {
/// <summary>Child View Model</summary>
this.dates = ko.observableArray();
this.previousStay = ko.observable();
}
RepeatGuest.prototype.addDate = function() {
var self = this.repeatGuest;
if (self.previousStay()) {
self.dates.push({
date: self.previousStay()
});
}
};
RepeatGuest.prototype.removeDate = function (date) {
this.dates.remove(date);
}
function ViewModel() {
var self = this;
self.repeatGuest = new RepeatGuest();
}
ko.applyBindings(new ViewModel());
I tu jest moje skrzypce: http://jsfiddle.net/6Px4M/2/
Dlaczego więc moja funkcja usuwania nie jest uruchamiana?
Możliwe pytanie poboczne: czy zagnieżdżony widok przedstawia niewłaściwą ścieżkę do nokautu, czy nie ma na ten temat zbyt wiele informacji?
Wolę wzór 'var self = this'. Łatwiej mi po prostu zawsze używać 'self' niż pamiętać o wiązaniu funkcji. Wygląda też czysto, imo. – Tyrsius
to dobra rzecz, +1 ode mnie, ale istniała bardziej fundamentalna kwestia, że funkcja nigdy nie była uruchamiana, odkąd utknął na prototypie. Chociaż gdyby podążał za wszystkimi twoimi krokami, które również zostaną rozwiązane. –
@Tyrsius - Próbowałem pokazać, jak wciąż możesz umieścić implementację funkcji na prototypie. 'self' to delikatny wzór. –