Я делаю переработку только для нокаута.
У меня это хорошо работает, если я применяю привязку к каждому элементу, как показано в этой скрипте: http://jsfiddle.net/paulinfrancis/wDJ9n/
Тем не менее, я бы хотел установить привязку к корневому элементу представления, а не по каждому элементу формы:
<div data-bind="readonly: isReadonly">
<!-- My form elements here -->
</div>
ko.bindingHandlers.readonlyView = {
init: function(element, valueAccessor){
var isReadOnly = ko.unwrap(ko.unwrap(valueAccessor()));
if (isReadOnly) {
var $elements = $(':text, :radio, :checkbox, :input', $(element));
$elements.each(function(){
var domElement = this;
ko.cleanNode(domElement);
var $domElement = $(domElement);
if ($domElement.is(':text')) {
//I need the observable bound to the textbox text
} else if ($domElement.is(':radio')) {
//I need to determine if the radio btn is checked
} else if ($domElement.is(':checkbox')) {
//I need to determine if the checkbox is checked
} else if($domElement.is(':input')) {
$domElement.prop('disabled', true);
}
})
}
}
}
Я не уверен, как получить имена свойств viewmodel, к которым привязаны элементы, так что я могу заменить существующие элементы своими исходными кодами по своему выбору.
Я могу получить доступ к значениям, которые мне нужны, используя dataFor или contextFor, но сначала мне нужно знать имена связанных свойств:
ko.dataFor(domElement)['observableOne']()
ko.contextFor(domElement).$data['observableOne']()
Я мог бы, конечно, разобрать атрибут привязки данных для каждого элемента, но это кажется грязным. Есть ли другие способы?
Я думаю, основываясь на вашем комментарии к 7zark7, то, что вы действительно хотите, это привязки if
и ifnot
:
<label>Had caffeine fix
<img src="checkmark.png" data-bind="if: isReadOnly() && coffeeConsumed()">
<input type="checkbox" data-bind="ifnot: isReadonly, checked: coffeeConsumed">
</label>
Вы уверены, что привязки Knockout "enable" или "disable" не будут работать для вас? Все они могут использовать один и тот же флаг "readOnly".
http://knockoutjs.com/documentation/enable-binding.html
<p>
Your cellphone number:
<input type='text' data-bind="value: cellphoneNumber, enable: hasCellphone" />
</p>
...
var viewModel = {
hasCellphone : ko.observable(false),
cellphoneNumber: ""
};