Próbuję skonfigurować ogólne szablony Knockout, które mogą być przełączane między trybem edycji i tylko do odczytu na podstawie typu danych. Jeśli kiedykolwiek korzystałeś z dynamicznych danych ASP.NET: to jest jak ich szablony pól. Na przykład:
<script type="text/html" id="text">
<!-- ko if: $root.editable -->
<input type="text" data-bind="value: $data" />
<!-- /ko -->
<!-- ko ifnot: $root.editable -->
<span data-bind="text: $data"></span>
<!-- /ko -->
</script>
Służy tak:
<label><input type="checkbox" data-bind="checked: editable" /> Editable</label>
<p>Name: <input data-bind="value: name" /></p>
<p>Name2: <span data-bind="template: { name: 'text', data: name }"></span></p>
z poniższym widoku modelu
var viewModel = {
name: ko.observable("Brian"),
editable: ko.observable(true)
};
Chodzi o to, aby móc korzystać z szablonów na poziomie pola jak w przykładzie "Name2" zamiast wyraźnych elementów/formantów. Pozwala to na łatwe przełączanie całych formularzy między trybem edycji i odczytu bez dużych fragmentów w większości zduplikowanych znaczników. Pozwala to również ponownego wykorzystania danych typu wspólnej edycji/wyświetlania znaczników, na przykład za pomocą datepickers dla pól data, itp
Problem
$data
pseudo zmiennej w szablonie nie ma wiążącego dwukierunkowy. Będzie odzwierciedlać aktualną wartość obserwowalnego, ale zmiany w sterowaniu wejściowym nie ustawią tej wartości.
Jak uzyskać dwukierunkową oprawę na $data
?
Zobacz również this jsfiddle
Dziękujemy! Jesteś mężczyzną Ryan! –
Jedno pytanie, być może ktoś wie dlaczego, kiedy używam słów kluczowych "$ data" i "$ item" - szablon nie jest renderowany, ale podczas uzyskiwania dostępu do elementów przekazywanych w 'foreach' przez nazwy pól ViewModel - wszystko działa dobrze, na przykład viewModel z tablicą użytkowników (z pojedynczym polem 'name'), a następnie powiązanie z' name' działa w szablonie, ale przy użyciu '$ data' lub' $ item' - nie może go uruchomić. Na przykład '' nie działa, ale '' jest w porządku, więc nie mam dostępu do '$ root, $ item, $ data' co może spowodować taki problem? Dzięki – sll
Może możesz utworzyć swój problem w jsFiddle? '$ item' jest dostępny tylko w szablonach jQuery. Jeśli '$ data' jest obiektem, to nie chciałbyś przekazać go do powiązania tekstu, chciałbyś zrobić' text: name' lub 'text: $ data.name' (druga składnia pomaga z niezdefiniowanym). –