#javascript #knockout.js #twitter-bootstrap-3 #x-editable
#javascript #knockout.js #twitter-bootstrap-3 #x-редактируемый
Вопрос:
Я хочу отобразить логическое значение на странице (на самом деле это будут ячейки в таблице), и оно должно быть доступно для редактирования. Кроме того, это не флажок, но я прописываю «false» и «true». Мы используем bootstrap 3 и последнюю версию knockout. Я решил использовать x-editable Bootstrap 3 build. Я также использую пользовательскую привязку knockout: https://github.com/brianchance/knockout-x-editable .
Я понял, что для реализации этого мне нужно настроить x-editable на режим всплывающего окна и выбрать тип. Я также указываю параметры («true» и «false» только в этом случае) в параметре. Почти все в порядке и отлично, за исключением того, что диалоговое окно на месте не отображает текущее значение, когда оно появляется. Как я могу это исправить? Я попробовал параметр ‘defaultValue’, но это не помогло.
Вот скрипка: http://jsfiddle.net/csabatoth/7ybVh/4 /
<span data-bind="editable: value,
editableOptions: { mode: 'popup', type: 'select',
source: '[{ value: 0, text: amp;#34;falseamp;#34; },
{ value: 1, text: amp;#34;trueamp;#34; }]' }">
</span>
простая модель:
function ViewModel() {
var self = this;
self.value = ko.observable(false);
}
Ответ №1:
Проблема в том, что у вас есть true
false
логические значения и в вашем observable, но x-editable использует значения 0
и 1
для представления выбора «true» и «false».
Это вызывает две проблемы:
- при инициализации x-editable не знает, что «false» означает 0, поэтому значение по умолчанию не выбрано
- если вы выберете что-либо в своем всплывающем редакторе, ваш
value
наблюдаемый объект будет содержать строки «0» и «1»false
, а неtrue
логические значения and …
Вы можете решить обе проблемы, введя вычисляемое свойство, которое преобразует логические и числовые значения:
self.computed = ko.computed({
read: function() { return self.value() ? 1 : 0 },
write: function(newValue) { self.value(newValue == '1') }
});
И вам нужно использовать это свойство в вашей editable
привязке:
<span data-bind="editable: computed,
editableOptions: { mode: 'popup', type: 'select',
source: '[{ value: 0, text: amp;#34;falseamp;#34; },
{ value: 1, text: amp;#34;trueamp;#34; }]' }">
</span>
Демонстрационный JSFiddle.