1

Проблема в том, что editable переопределяет текст по умолчанию внутри кнопки. В этом примере glyphicon заменяется на значение selection.Knockout x-editable overriding button text

Это поведение по умолчанию, но вместо этого я хочу изменить только переменную Knockout и оставить содержимое кнопки html неповрежденным.

Есть ли опция в editableOptions или как можно отключить эту функцию?

var viewModel = function() { 
 
    this.selection = ko.observable(); 
 
    this.options = ko.observableArray([{value:"AND", label:"All"}, {value:"OR", label:"Any"}]); 
 
    this.hidden = function() {return false}; 
 
}; 
 
ko.applyBindings(new viewModel());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script> 
 
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet" /> 
 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous"> 
 
<link href="http://vitalets.github.com/x-editable/assets/x-editable/bootstrap-editable/css/bootstrap-editable.css" rel="stylesheet" /> 
 
<script src="http://vitalets.github.com/x-editable/assets/x-editable/bootstrap-editable/js/bootstrap-editable.js"></script> 
 
<script src="http://cdnjs.cloudflare.com/ajax/libs/knockout/2.2.1/knockout-min.js"></script> 
 
<script src="http://www.eleganttechnologies.com/outside/scripts/jsfiddle/knockout.x-editable.js"></script> 
 

 
<span data-bind="text:selection"></span> 
 
<button type="button" class="btn btn-primary btn-sm editable-submit" data-bind="editable: selection, editableOptions:{type:'select', options: options, optionsText: 'label', optionsValue: 'value', hidden: hidden}"><i class="glyphicon glyphicon-plus"></i></button>

+0

Хороший вопрос. Однако теги, зависящие от версии, вероятно, лишние, не так ли? То есть проблема, которую вы описываете, не зависит от версии (кроме требований минимальной версии)? – Jeroen

+0

Справа. Похоже, что это поведение, а не версия. Я думаю, что это хорошо работает с 'div' или' span', но я бы не ожидал этого bahavior для 'button', где я просто хочу, чтобы редактируемый отображался, и значение, которое будет использоваться где-то еще. –

ответ

2

Глядя на the source, я нахожу

//setup observable to fire only when editable changes, not when options change 
//http://www.knockmeout.net/2012/06/knockoutjs-performance-gotcha-3-all-bindings.html 
ko.computed({ 
    read: function() { 
    var val = ko.utils.unwrapObservable(valueAccessor()); 
    $editable.editable('setValue', val || '', true) 
    }, 
    owner: this, 
    disposeWhenNodeIsRemoved: element 
}); 

Там нет возможности контролировать его, так что вы не можете изменить его. Вам нужно будет использовать модифицированную версию обработчика привязки с удаленным.

Я был в состоянии получить эффект, который вы хотите, изменяя кусок связывания обработчика следующим образом:

//create editable 
    var glyphHtml = $element.html(); // saves the original contents of the button 
    var $editable = $element.editable(editableOptions); 

    //update observable on save 
    if (ko.isObservable(value)) { 
     $editable.on('save.ko', function(e, params) { 
     value(params.newValue); 
     }) 
    }; 

    if (editableOptions.save) { 
     $editable.on('save', editableOptions.save); 
    } 

    //setup observable to fire only when editable changes, not when options change 
    //http://www.knockmeout.net/2012/06/knockoutjs-performance-gotcha-3-all-bindings.html 
    ko.computed({ 
     read: function() { 
     var val = ko.utils.unwrapObservable(valueAccessor()); 
     // Restores the original contents of the button. 
     setTimeout(function() { 
      $editable.html(glyphHtml); 
     }, 0); 
     }, 
     owner: this, 
     disposeWhenNodeIsRemoved: element 
    }); 
+0

Вы правы, что предотвращает установку начального значения. Тем не менее, содержимое кнопки 'button' html по-прежнему заменяется после выбора. –

+0

@PeterGerhat Это не только начальный набор. Это код, который срабатывает каждый раз при выборе. –

+0

@PeterGerhat Но вы правы, что редактируемые по-прежнему изменяются при обновлении. –