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();