Asp.net mvc 3 剔除已检查的绑定问题

Asp.net mvc 3 剔除已检查的绑定问题,asp.net-mvc-3,knockout.js,Asp.net Mvc 3,Knockout.js,我在使用KnockoutJS2.0时遇到了一个复选框绑定问题。我有一个对象数组。这些对象的属性之一是不同对象的数组。在子对象中有几个属性,其中一个是布尔属性。我为每个父对象建立一个列表,并在每个父对象下显示子对象。对于每个子级列表,我有两个视图,一个只读视图和一个编辑视图。在只读模式中,我有一些图像,它们表示是否基于布尔属性检查项目。这是可行的,如果我通过控制台更新布尔值,我会看到我期望的图像消失或显示基于我指定的值。在“编辑”视图中,图像将替换为复选框。当我通过控制台更新值时,我看到了相同的行

我在使用KnockoutJS2.0时遇到了一个复选框绑定问题。我有一个对象数组。这些对象的属性之一是不同对象的数组。在子对象中有几个属性,其中一个是布尔属性。我为每个父对象建立一个列表,并在每个父对象下显示子对象。对于每个子级列表,我有两个视图,一个只读视图和一个编辑视图。在只读模式中,我有一些图像,它们表示是否基于布尔属性检查项目。这是可行的,如果我通过控制台更新布尔值,我会看到我期望的图像消失或显示基于我指定的值。在“编辑”视图中,图像将替换为复选框。当我通过控制台更新值时,我看到了相同的行为,在我期望值时检查它,而不是在我不希望时检查它。当我选中或取消选中复选框时,问题就出现了。这样做不会更改复选框绑定到的基础值

以下是我的数据的基本概念

[
    {
        "xxx": "yyy",
        "xxx": "yyy",
        ...
        "Displays": [
            {
            "xxx": "yyy",
            ...
                "Excluded": false,
            },
            {
            "xxx": "yyy",
             ...
                "Excluded": true,
            }
        ],
    }
]
这是装订

<input type="checkbox" data-bind="checked: !Excluded()" />

问题是,这里选中的是一个双向绑定:需要读取绑定属性以生成正确的视图,但也需要在单击复选框时进行更新。将其与以下绑定进行对比:

<span data-bind="text: 'your name is ' + name()"></span>
当表达式仅被读取时,您可以使用表达式,并且需要展开可观察对象

因此,您需要直接绑定到observable属性,而无需将其展开。此外,在需要时,可以通过敲除来完成读写操作:

<input type="checkbox" data-bind="checked: Excluded" />
有关简单示例,请参见。请注意复选框标签是如何在更改时更新的,以显示模型已更新且渲染触发正确

如果需要对该值求反,以便在该值为false时选中复选框,则可以添加可写的计算可观测值,如“可写的计算可观测值”一节中所述,或者可以在发送数据之前在服务器上或在填充viewmodel之前在客户端上对viewmodel中的数据求反


希望这会有所帮助。

问题在于,这里选中的是一个双向绑定:需要读取绑定属性以生成正确的视图,但也需要在单击复选框时更新。将其与以下绑定进行对比:

<span data-bind="text: 'your name is ' + name()"></span>
当表达式仅被读取时,您可以使用表达式,并且需要展开可观察对象

因此,您需要直接绑定到observable属性,而无需将其展开。此外,在需要时,可以通过敲除来完成读写操作:

<input type="checkbox" data-bind="checked: Excluded" />
有关简单示例,请参见。请注意复选框标签是如何在更改时更新的,以显示模型已更新且渲染触发正确

如果需要对该值求反,以便在该值为false时选中复选框,则可以添加可写的计算可观测值,如“可写的计算可观测值”一节中所述,或者可以在发送数据之前在服务器上或在填充viewmodel之前在客户端上对viewmodel中的数据求反


希望这能有所帮助。

我放弃了用bool值来处理它的尝试,创建了一个选定对象的数组,并以这种方式处理它。这不是最佳的解决方案,但我已经厌倦了与之抗争。

我放弃了用布尔值来处理这个问题,创建了一个选定对象的数组,并以这种方式处理它。这不是最佳解决方案,但我已经厌倦了与之抗争。

我知道我的答案在游戏中有点晚了,但我今天遇到了这个问题,这是我能找到的与问题相关的最接近的线索,似乎没有解决它的答案。这是我的解决方案

本质上,问题是knockout确实希望viewModel值是字符串,而不是布尔值,但这并不总是实用的。因此,我创建了一个名为isChecked的绑定,它严格适用于布尔值。注意:这仅适用于可观察属性

ko.bindingHandlers.isChecked = {
    getElementDeclaredValue: function (element) {
        var declaredValue = element.getAttribute("value");

        // If a value is provided, we presume it represents "true",
        // unless its explicitly "false". If no value is provided, we
        // presume that a checked state would equal "true".
        return declaredValue && Boolean.isBool(declaredValue)
            ? Boolean.parse(declaredValue)
            : true;
    },

    init: function (element, valueAccessor) {
        var updateHandler = function () {
            var declaredValue = ko.bindingHandlers.isChecked.getElementDeclaredValue(element);
            var elementValue = element.checked ? declaredValue : !declaredValue;

            var modelValue = valueAccessor();
            var currentValue = ko.utils.unwrapObservable(modelValue);

            if (elementValue === currentValue)
                return;

            if (ko.isObservable(modelValue)) {
                modelValue(elementValue);
            }
        };

        ko.utils.registerEventHandler(element, "click", updateHandler);
    },

    update: function (element, valueAccessor) {
        var elementValue = ko.bindingHandlers.isChecked.getElementDeclaredValue(element);
        element.checked = elementValue === ko.utils.unwrapObservable(valueAccessor());
    }
};
parse和isBool这两个布尔方法的定义如下:

Boolean.isBool = function (value) {
    return (/^(?:true|false)$/i).test(value);
};

Boolean.parse = function (value) {
    return (/^true$/i).test(value);
};
我将忽略那些说我不应该修改内置对象原型的评论;我想怎么做就怎么做;-

用法与选中的绑定相同。值属性是可选的,除非希望选中状态表示false:

<input type="radio" id="rbNewClaim" name="ClaimType" value="false" data-bind="checked: isExistingClaim" />

希望这对某人有所帮助。

我知道我的答案在游戏中有点晚了,但我今天遇到了这个问题,这是我能找到的与这个问题相关的最接近的线索,而且似乎没有解决这个问题的答案。这是我的解决方案

本质上,问题是knockout确实希望viewModel值是字符串,而不是布尔值,但这并不总是实用的。因此,我创建了一个名为isChecked的绑定,它严格适用于布尔值。注意:这仅适用于可观察属性

ko.bindingHandlers.isChecked = {
    getElementDeclaredValue: function (element) {
        var declaredValue = element.getAttribute("value");

        // If a value is provided, we presume it represents "true",
        // unless its explicitly "false". If no value is provided, we
        // presume that a checked state would equal "true".
        return declaredValue && Boolean.isBool(declaredValue)
            ? Boolean.parse(declaredValue)
            : true;
    },

    init: function (element, valueAccessor) {
        var updateHandler = function () {
            var declaredValue = ko.bindingHandlers.isChecked.getElementDeclaredValue(element);
            var elementValue = element.checked ? declaredValue : !declaredValue;

            var modelValue = valueAccessor();
            var currentValue = ko.utils.unwrapObservable(modelValue);

            if (elementValue === currentValue)
                return;

            if (ko.isObservable(modelValue)) {
                modelValue(elementValue);
            }
        };

        ko.utils.registerEventHandler(element, "click", updateHandler);
    },

    update: function (element, valueAccessor) {
        var elementValue = ko.bindingHandlers.isChecked.getElementDeclaredValue(element);
        element.checked = elementValue === ko.utils.unwrapObservable(valueAccessor());
    }
};
parse和isBool这两个布尔方法是defin 详情如下:

Boolean.isBool = function (value) {
    return (/^(?:true|false)$/i).test(value);
};

Boolean.parse = function (value) {
    return (/^true$/i).test(value);
};
我将忽略那些说我不应该修改内置对象原型的评论;我想怎么做就怎么做;-

用法与选中的绑定相同。值属性是可选的,除非希望选中状态表示false:

<input type="radio" id="rbNewClaim" name="ClaimType" value="false" data-bind="checked: isExistingClaim" />

希望这对其他人有所帮助。

尝试从绑定中删除已选中:已排除。仅当您在可观察属性上计算表达式时才需要它,在本例中,您的排除属性甚至不是可观察的。它是可观察的,我只是没有发布代码使其成为可观察的。请尝试从绑定中删除选中:排除。只有在对可观察属性求值表达式时才需要它,在这种情况下,排除的属性甚至不是可观察的。它是可观察的,我只是没有发布代码使其成为可观察的。如果我不使用括号,它根本不起作用。复选框从不被选中,并且选中它们不会更新可观察的对象。如果我不使用括号,它根本不起作用。复选框永远不会被选中,并且选中它们不会更新可观察对象。