Javascript 为接受数组的敲除创建自定义CSS类绑定
我正在尝试修改上显示的Javascript 为接受数组的敲除创建自定义CSS类绑定,javascript,knockout.js,Javascript,Knockout.js,我正在尝试修改上显示的类绑定: 所以,现在我的是这样的: ko.bindingHandlers.cssClass = { update: function (element, valueAccessor) { var cssClass = ko.utils.unwrapObservable(valueAccessor()), prevCssClass = element['__ko__previousClassValue__'];
类
绑定:
所以,现在我的是这样的:
ko.bindingHandlers.cssClass = {
update: function (element, valueAccessor) {
var cssClass = ko.utils.unwrapObservable(valueAccessor()),
prevCssClass = element['__ko__previousClassValue__'];
console.log("Previous:", prevCssClass);
console.log("Current:", cssClass);
if (Object.prototype.toString.call(prevCssClass) === '[object Array]') {
ko.utils.arrayForEach(prevCssClass, function (classAccessor) {
var value = ko.utils.unwrapObservable(classAccessor);
ko.utils.toggleDomNodeCssClass(element, value, false);
});
} else if (prevCssClass) {
ko.utils.toggleDomNodeCssClass(element, prevCssClass, false);
}
if (Object.prototype.toString.call(cssClass) === '[object Array]') {
ko.utils.arrayForEach(cssClass, function (classAccessor) {
var value = ko.utils.unwrapObservable(classAccessor);
ko.utils.toggleDomNodeCssClass(element, value, true);
});
} else if (cssClass) {
ko.utils.toggleDomNodeCssClass(element, cssClass, true);
}
element['__ko__previousClassValue__'] = cssClass;
}
};
我可以和你一起玩。我的问题是,第一次单击“更改”时,这就像一个符咒,但在那之后的任何时候,prevCssClass
对于多个
可观察数组来说都是不正确的(单个效果很好)。。。它反映的是cssClass
而不是前一个值的实际值。为什么?我不明白为什么会发生这种事,我觉得一切都很好
错误的控制台输出是:
Previous: undefined
Current: ["blue","small"]
Previous: ["blue"]
Current: ["blue"]
Previous: ["blue","big"]
Current: ["blue","big"]
正确的输出应为:
Previous: undefined
Current: ["blue","small"]
Previous: ["blue","small"]
Current: ["blue"]
Previous: ["blue"]
Current: ["blue","big"]
我正在测试Chrome
更新:
答案如下。如果您感兴趣,此新绑定的要点如下(已全部清理):
这是我在某处学会的一个小javascript技巧。。。也许jQuery的来源,我不记得了 关键是创建数组的副本。使用
.concat()
基本上会附加一个空数组,强制Javascript创建现有数组的副本
if (Object.prototype.toString.call(prevCssClass) === '[object Array]') {
prevCssClass = prevCssClass.concat();
这允许您存储当前阵列的历史副本。对原始对象的任何修改都不会影响您的“克隆”阵列。我今天很累,但这是您期望的行为吗?对你能解释一下你做了什么以及为什么
concat
修复了一切吗?然后我会把它标记为一个答案。当然,我会添加一个答案。啊!这是有道理的,我要花很长时间才能弄明白。非常感谢。我通常制作数组副本的方法是使用slice
:copy=array.slice(0)
<代码>concat似乎更简单。谢谢
if (Object.prototype.toString.call(prevCssClass) === '[object Array]') {
prevCssClass = prevCssClass.concat();