Próbuję napisać moje szablony KO w pewien sposób, i wydaje się, że powodują problemy z Knockout, który zatrzymuje aktualizowanie widoku. Życzę, aby uniknąć zbyt wiele wyraźnych zależności w moich poglądów, jak to możliwe, więc kiedy piszę szablon do dodawania do listy plików załączników, myślałem, że mogę skorzystać z zmiennej $data
:
<script id="attachments-template" type="text/html">
<input type="button" data-bind="attachments: $data" value="add">
</script>
A oprawa szablonu:
<div data-bind="template: {name: 'button-add-data', data: attachments}"></div>
Dzięki temu faktyczna właściwość jest odwzorowywana w miejscu użycia, a nie w przypadkowych szablonach. Procedura obsługi powiązań attachments
w moim rzeczywistym przypadku obejmuje wtyczkę jQuery fileupload, ale samo wywołanie push(i++)
pokazuje mimo to problem.
var i = 0;
ko.bindingHandlers.attachments = {
init: function(element, valueAccessor) {
var files = valueAccessor();
$(element).click(function() {
files.push(i++);
});
}
};
var list = ko.observableArray();
var model= {
attachments: list
};
ryba, która pokazuje to, używając KO 2.2.0: http://jsfiddle.net/stofte/sWGkJ/ skrzypcach pokazuje również, że wiążący wobec wyraźnego nieruchomości działa dobrze.
Oczywiście jest wiele rzeczy w Google i SO na KO i kontekstach wiążących, ale nie mogę znaleźć niczego na temat użycia danych $ w wiążących programach obsługi, nie jestem pewien, co łamie mi prawo KO wykorzystanie danych $, ale wydaje się, że byłoby rozsądnie robić to, co chcę?
Wygląda na to, że po prostu przenosisz problem na swoją maszynę wirtualną. Musiałbym dostosować do moich modeli różne listy, a co gorsza cały mój istniejący kod, który działa na tych listach. Nie sądzę, żeby to było lepsze. – Svend
Cześć Svend, masz rację. Poprawiłem moją odpowiedź, by podać podobne, ale być może bardziej eleganckie rozwiązanie. Może to być w rzeczywistości błąd w zamierzonym działaniu nokautu - ale z drugiej strony może istnieć powód, dla którego zachowuje się w ten sposób. Być może pytanie do Steve Sandersona? –