由于@combatc2 解决方案现在似乎不起作用,我为此创建了另一个自定义绑定,添加了一个显示更多/更少锚以在截断文本和原始文本(Dotdotdot v5.0.4 (es6)
, Knockout v3.5.0
)之间切换。
<div data-bind="dotdotdot: myObservable, maxHeight:250, moreLess: true"></div>
ko.bindingHandlers["dotdotdot"] = {
init: function(element, valueAccessor, allBindingsAccessor) {
let valueUnwrapped = ko.utils.unwrapObservable(valueAccessor());
const maxHeight = allBindingsAccessor().maxHeight || 100;
const moreLess = allBindingsAccessor().moreLess || false; //show more/less anchor
function addMoreLess(val) {
if (val != null && moreLess)
val += '<a class="ddd-toggle d-none ddd-keep" href="#"></a>';
return val;
}
valueUnwrapped = addMoreLess(valueUnwrapped);
if (valueUnwrapped == null) valueUnwrapped = "";
var options = {
height: maxHeight,
watch: "window", //"window" avoids recalculating the truncation after adding show more/less anchor.
keep: ".ddd-keep" // preserve these elements (for show more/less anchor)
};
$(element).html(valueUnwrapped);
var ddd = new Dotdotdot(element, options); //es6 version
//show more/less anchor handler
$(element).on("click", ".ddd-toggle", function(e) {
e.preventDefault();
if ($(element).hasClass("ddd-truncated")) {
ddd.restore();
$(element).addClass("ddd-full-story");
} else {
$(element).removeClass("ddd-full-story");
ddd.truncate();
ddd.watch();
}
});
//we put the 'update' callback code in a computed here so it gets the 'ddd' Dotdotdot instance)
ko.computed({
read: function() {
var text = ko.utils.unwrapObservable(valueAccessor());
ddd.API.unwatch();
text = addMoreLess(text);
$(element).html(text);
//we need to update the originalContent (no API method here)
ddd.originalContent = ddd._getOriginalContent();
ddd.API.truncate();
ddd.API.watch();
},
disposeWhenNodeIsRemoved: element
});
}
}
锚“显示更多/更少”的CSS:
.d-none{display:none;}
.ddd-truncated .ddd-toggle,
.ddd-full-story .ddd-toggle{
display: inline !important;
}
.ddd-toggle:before {
content: '[ Show more ]';
}
.ddd-full-story .ddd-toggle:before {
content: '[ Show less ]';
}
工作示例:
https ://codepen.io/raguchi/pen/VRVwqx
(请注意,该示例适用于 es6 版本的 Dotdotdot)