【问题标题】:Knockout mapping not working with array of checkboxes淘汰赛映射不适用于复选框数组
【发布时间】:2012-09-11 03:46:37
【问题描述】:

我正在尝试在复选框列表上实现全选/全选功能。

单击全选应选中三个复选框。在损坏的示例中,单击全选不会更新复选框。但是它确实会更新数组。

这个小提琴有效:Working Fiddle

这个小提琴没有:Broken Example

两者之间的唯一区别是调用 ko.mapping 似乎没有正确设置可观察数组。

var initialData = {"Products":[{"Id":"1","Title":"Item 1"},{"Id":"2","Title":"Item 2"},{"Id":"3","Title":"Item 3"}]};  

var viewModel = ko.mapping.fromJS(initialData); 

我做错了什么?

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    问题在于,当您使用ko.mapping 时,输入的每个 属性都会变成observable

    这意味着在您的第一个示例中您可以:

    viewModel.selectAll = function() {
        viewModel.checkedProducts.removeAll();
        ko.utils.arrayForEach(viewModel.Products(), function(product) {
            viewModel.checkedProducts.push(product.Id);  // Id is a plain value
        });
    };
    

    在您的映射示例中,您必须这样做:

    viewModel.selectAll = function() {
        viewModel.checkedProducts.removeAll();
        ko.utils.arrayForEach(viewModel.Products(), function(product) {
            viewModel.checkedProducts.push(product.Id());  // Id is an observable!
        });
    };
    

    http://fiddle.jshell.net/ZeCWP/6/


    真正干净的应该是这样的:

    viewModel.selectAll = function() {
        viewModel.checkedProducts.removeAll();
        ko.utils.arrayForEach(viewModel.Products(), function(product) {
            viewModel.checkedProducts.push( ko.utils.unwrapObservable(product.Id) );
        });
    };
    

    这在这两种情况下都有效。但在受控环境中,并非绝对需要使用 unwrapObservable(),因为您知道该值将始终是可观察的。

    【讨论】:

    • 你就是那个男人。你不知道我在这上面花了多少时间。谢谢。
    • @rboarman 未来调试的小提示。在某处添加<div data-bind="text: $parent.property">(或您感兴趣的任何值)。 Knockout 自己对数据绑定值进行一级解包(实际上,它内部使用unwrapObservable())。所以如果你看到一个简单的值,你很好。如果您看到function c(){if(0<arguments.length) etc etc ...,您将面临一个包含可观察对象的可观察对象。这意味着你忘记在途中打开一个 observable。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2012-12-04
    相关资源
    最近更新 更多