2014-02-14 2 views
0

Я хочу использовать собственный обработчик привязки (fadeVisible) для fadein/fadeout для форм. Но я также хочу использовать обработчик привязки. Если я использую оба вместе, набор обработчиков привязки всегда отображается равным none, прежде чем обработчик fadeVisible сможет это сделать. Таким образом, эффект затухания отсутствует. Каков правильный способ сделать это?Как я могу объединить с привязкой и настраиваемой видимой привязкой для эффектов fadein/fadeout?

Пример: jsfiddle

<form data-bind="with:address, fadeVisible:address"> 
+0

Любая конкретная причина вы хотите использовать 'with' здесь? Если вы удалите его и внесите соответствующие изменения в привязки, он будет работать. –

+0

В этом специальном случае я автоматически генерирую поля ввода для нокаута, а поле ввода не должно иметь ссылки на родительский (адрес). – Rheinprinz

+0

Спасибо, что поняли это. Это имеет смысл, почему вы хотите сделать это сейчас. –

ответ

1

Вы можете эмулировать with обвязки установки address в качестве внутреннего связывания контекста элемента. Вот обновлённый связывание называется fadeVisibleWith ...

ko.bindingHandlers.fadeVisibleWith = { 
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { 
     var value = valueAccessor(); 
     $(element).hide(); 

     var innerBindingContext = bindingContext.extend(value); 
     ko.applyBindingsToDescendants(innerBindingContext, element); 
     return { controlsDescendantBindings: true }; 
    }, 
    update: function(element, valueAccessor) { 
     var value = valueAccessor(); 
     ko.unwrap(value) ? $(element).fadeIn() : $(element).fadeOut(); 
    } 
}; 

И изменить связывание с точки зрения ...

<form data-bind="fadeVisibleWith:address"> 
    <p> 
     <label>firstname</label> 
     <input data-bind="value:firstName"/> 
    </p> 
    <p> 
     <label>lastname</label> 
     <input data-bind="value:lastName"/> 
    </p> 
</form>  

Fiddle: http://jsfiddle.net/C2Z9f/10/

Подробнее: Creating custom bindings that control descendant bindings

0

Вы можете устранить «с» связывания полностью из кода и непосредственно связывать свои входы с адресом наблюдаемой

<form data-bind="fadeVisible:address"> 
<p> 
    <label>firstname</label> 
    <input data-bind="value:address().firstName"/> 
</p> 
<p> 
    <label>lastname</label> 
    <input data-bind="value:address().lastName"/> 
</p> 
</form> 

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

clear:function() { 
    this.address(''); 
}, 

Updated Fiddle

+0

У меня не будет адресной ссылки в моих полях ввода. – Rheinprinz

Смежные вопросы