#knockout.js
#knockout.js
Вопрос:
Я использую наблюдаемый нокаут, вызываемый this.expanded
как для обработки, отображать или нет некоторый HTML, так и для использования значения внутри aria-expanded
атрибута.
<button data-bind="attr: { 'aria-expanded': expanded }">
<!-- ko if : expanded -->
<div>...</div>
<!-- /ko -->
Проблема с использованием моей переменной expanded
в обоих случаях заключается в том, что я замечаю, когда expanded
значение false, я вообще не получаю вывод aria-expanded
атрибута.
// When expanded is true:
<button aria-expanded="true"></button>
// When expanded is false:
<button></button>
// What I want:
<button aria-expanded="false"></button>
Как я могу по-прежнему выводить атрибут, просто с false
помощью, когда expanded
false ?
Я попытался создать вторичную переменную, которая проверяла бы наблюдаемое и преобразовывала его в строку:
this.expandedStatus = this.expanded().toString()
Но я заметил, что expandedStatus
, похоже, это больше не обновляется / не наблюдается, если используется таким образом.
Ответ №1:
Вы могли бы просто привязать aria-expanded
атрибут к toString()
значению наблюдаемого, не вводя нового наблюдаемого. Посмотрите на пример ниже:
function Test() {
var self = this;
self.expanded = ko.observable(false);
self.toggleExpanded = function() {
self.expanded(!self.expanded());
}
}
ko.applyBindings(new Test());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<button data-bind="attr: { 'aria-expanded': expanded().toString() }">
<!-- ko if : expanded -->
<span>...</span>
<!-- /ko -->
</button>
<p>
<button data-bind="click: toggleExpanded">Toggle</button>
</p>
Комментарии:
1. Спасибо за ваше решение! В итоге я нашел действительно простой способ сделать это без дополнительных функций (только что опубликовал ответ).
Ответ №2:
В итоге я нашел действительно простое решение, которое заключалось в том, чтобы просто установить aria-expanded через троичный:
<button data-bind="attr: { 'aria-expanded': expanded() ? 'true' : 'false' }">
Ответ №3:
Альтернативный подход заключается в использовании обработчика привязки вместе с jQuery для большего удобства, подобного этому:
<button data-bind="isAriaExpanded: expanded ">
<!-- ko if : expanded -->
<div>...</div>
<!-- /ko -->
…
ko.bindingHandlers.isAriaExpanded= {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
jQuery(element).attr('aria-expanded',false);//initially setting to false
},
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
value = valueAccessor();
valueUnwrapped = ko.unWrap(value);
jQuery(element).attr('aria-expanded',valueUnwrapped);//whenever the expanded() is changed automatically aria-expanded attribute gets updated
}
};