前端之家收集整理的这篇文章主要介绍了
jquery – KnockoutJS:淡出其他东西后淡入淡出,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一组3个单选按钮:
dio" name="Who" value="Myself"
checked="@isMyselfChecked" data-bind="checked: who" />
Mine
dio" name="Who" value="MemberId"
checked="@isMemberIdChecked" data-bind="checked: who" />
I know the member's ID
dio" name="Who" value="MemberUrl"
checked="@isMemberUrlChecked" data-bind="checked: who" />
I know the member's URL
当用户选择第一个单选按钮(Mine / Myself)时,不需要额外的输入.但是,在选择第二个或第三个时,需要额外的输入:
只需在依赖文本框中使用data-bind =“visible:who()==='[MemberId | MemberUrl]’”即可.但是,如果我想添加淡入/淡出过渡怎么办?
我从淘汰站点尝试了示例自定义fadeVisible bindingHandler,我理解它是如何工作的.然而,这将同时在文本框中淡出和淡出.如果选择了无线电’MemberId’,并且用户选择’MemberUrl’无线电,我希望MemberId文本框在MemberUrl文本框淡入之前淡出.
以下是我现在所拥有的,它有效,但我不认为这是最佳的.在前一个元素消失之前,怎么还能告诉他们不执行淡入淡出?我需要另一个ko.observale,还是可能是ko.computed?
var viewmodel = {
fadeSpeed: 150,who: ko.observable($('input[type=radio][name=Who]:checked').val())
};
ko.bindingHandlers.toggleWho = {
init: function (element,valueAccessor) {
var value = valueAccessor();
var unwrapped = ko.utils.unwrapObservable(value);
if (unwrapped === element.name)
$(element).show();
},update: function (element,valueAccessor) {
var value = valueAccessor();
var unwrapped = ko.utils.unwrapObservable(value);
// when selected value is myself,fade out the visible one,if any
if (unwrapped === 'Myself') {
$('input[type=text][name=MemberId]:visible')
.fadeOut(viewmodel.fadeSpeed);
$('input[type=text][name=MemberUrl]:visible')
.fadeOut(viewmodel.fadeSpeed);
}
// when selected value is memberid,may need to fade out url first
else if (unwrapped === 'MemberId') {
if ($('input[type=text][name=MemberUrl]:visible').length > 0) {
$('input[type=text][name=MemberUrl]:visible')
.fadeOut(viewmodel.fadeSpeed,function () {
$('input[type=text][name=MemberId]')
.fadeIn(viewmodel.fadeSpeed);
});
} else {
$('input[type=text][name=MemberId]')
.fadeIn(viewmodel.fadeSpeed);
}
}
// when selected value is memberurl,may need to fade out id first
else if (unwrapped === 'MemberUrl') {
if ($('input[type=text][name=MemberId]:visible').length > 0) {
$('input[type=text][name=MemberId]:visible')
.fadeOut(viewmodel.fadeSpeed,function () {
$('input[type=text][name=MemberUrl]')
.fadeIn(viewmodel.fadeSpeed);
});
} else {
$('input[type=text][name=MemberUrl]')
.fadeIn(viewmodel.fadeSpeed);
}
}
}
};
ko.applyBindings(viewmodel);
最佳答案
您将不得不适应这一点以适应您的示例,但我需要简化它以在
this fiddle中进行测试.
这是绑定:
var prevIoUsElement = null;
ko.bindingHandlers.fadeSwitcher = {
init: function(element,valueAccessor) {
var value = valueAccessor();
$(element).toggle(ko.utils.unwrapObservable(value));
},update: function(element,valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
if (value) {
if (prevIoUsElement == null) { // initial fade
$(element).fadeIn();
} else {
$(prevIoUsElement).fadeOut('fast',function() {
$(element).fadeIn();
});
}
prevIoUsElement = element;
}
}
};