Ausblendung sagen, dass ich einen Satz von 3 Radiobuttons habe:KnockoutJS: verblassen in nach etwas anderen
<div>
<label>
<input type="radio" name="Who" value="Myself"
checked="@isMyselfChecked" data-bind="checked: who" />
Mine
</label>
<label>
<input type="radio" name="Who" value="MemberId"
checked="@isMemberIdChecked" data-bind="checked: who" />
I know the member's ID
</label>
<label>
<input type="radio" name="Who" value="MemberUrl"
checked="@isMemberUrlChecked" data-bind="checked: who" />
I know the member's URL
</label>
</div>
Wenn der Benutzer das erste Optionsfeld (Bergwerk/Myself), keine zusätzliche Eingabe erforderlich ist. Wenn jedoch die zweite oder dritte, zusätzliche Eingangs Auswahl ist erforderlich:
<div>
<input type="text" name="MemberId" placeholder="Enter Member ID"
data-bind="toggleWho: who()" style="display: none" />
<input type="text" name="MemberUrl" placeholder="Enter Member URL"
data-bind="toggleWho: who()" style="display: none; width: 450px;" />
</div>
Es ist leicht genug, nur data-bind="visible: who() === '[MemberId|MemberUrl]'"
auf den abhängigen Textfelder haben. Was aber, wenn ich Fade-In/Out-Übergänge hinzufügen möchte?
Ich habe das Beispiel benutzerdefinierte fadeVisible
bindingHandler
aus der KO-Site ausprobiert, und ich verstehe, wie es funktioniert. Dies wird jedoch in den Textfeldern gleichzeitig ausgeblendet und ausgeblendet. Wenn Radio 'MemberId'
ausgewählt ist, und Benutzer wählt 'MemberUrl'
Radio, mag ich das MemberId
Textfeld auszublenden vor das MemberUrl
Textfeld eingeblendet wird.
Im Folgenden finden Sie, was ich habe jetzt, und es funktioniert, aber ich don‘ Ich denke, es ist optimal. Wie sonst kann Knockout gesagt werden, das Einblenden nicht durchzuführen, bis ein vorheriges Element ausgeblendet wurde? Brauche ich noch eine ko.observale
oder möglicherweise eine 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);
Ich bin froh, dass ich helfen konnte. Vielleicht möchten Sie eine modellorientierte Lösung in Erwägung ziehen. Mit KO werden die Dinge einfacher, wenn Sie dem MVVM-Muster folgen. – Tyrsius
@Tyrsius, von "modellorientierte Lösung", meinst du eine foreach zu verwenden, um die Radios von der VM zu rendern, anstatt sie explizit in HTML auszugeben? – danludwig
Ja, unter anderem. Die Idee im MVVM-Muster ist, dass die Ansicht keine Daten enthält, sondern nur, wie Sie Ihr Modell anzeigen können. Alle Daten sollten im Modell sein. Dadurch können sowohl die Ansicht als auch das Modell von beliebigen Daten verwendet werden. – Tyrsius