【问题标题】:Adding an Observable Property to a mapped Observable Array using Knockout JS Mapping Options使用 Knockout JS 映射选项将 Observable 属性添加到映射的 Observable 数组
【发布时间】:2015-03-17 07:21:49
【问题描述】:

我正在使用由 AJAX 调用和 Knockout 映射插件填充的 Knockout 可观察数组 (self.data) 在视图中绑定表。目的是让 ViewModel 作为一个可重用的组件。

我需要添加一列来选择表格行。我想通过使用映射选项为self.data observable 数组中的每个项目添加一个布尔值isSelected observable 属性来做到这一点。然后self.selectClicked 函数使用此可观察属性将项目推送或弹出到self.selectedItems 可观察数组。

问题是,我不太确定如何将 isSelected 属性添加到每个数组项。

这是目前的代码:

//// NOTE: ko.applyBindings and the AJAX call currently happen outside of this code.

function ViewModel() {

var self = this;

var mapping = {
    // Boolean observable property for each array item added here?
};

self.data = ko.observableArray([]);
self.selectedItems = ko.observableArray([]);

self.selectClicked = function (data, event) {

    if (event.currentTarget.checked) {
        self.selectedItems.push(data);                       
    }
    else {
        self.selectedItems.pop(data);
    }

    return true;
};

// AJAX Data is pushed to the self.data observable array through this function
self.addData = function (_data) {

    ko.mapping.fromJS(_data, mapping, self.data);

};
}

【问题讨论】:

    标签: javascript knockout.js knockout-mapping-plugin


    【解决方案1】:

    您可以手动创建数据对象并使用create 添加isSelected

    var mapping = 
    {
        create: function(_data) {
            return new Data(_data.data);
        }
    };
    
    self.addData = function (_data) {
        ko.mapping.fromJS(_data, mapping, self.data);
    };
    
    var Data = function (data) {
        var self = this;
    
        ko.mapping.fromJS(data, {}, self);
    
        self.isSelected = ko.observable(false);
    };
    

    JsFiddle

    这在Knockout mapping plugin documentation 中有记录。

    【讨论】:

    • 我怀疑我在某处做错了什么,但我从 Knockout 收到了 ReferenceError: Name is not defined 错误(名称是表格的第一列)。我不明白为什么解决方案会不正确,但是用{} 替换ko.mapping.fromJS(_data, mapping, self.data); 中的映射参数不会导致问题,因此问题似乎出在映射调用('ko.mapping.fromJS( data, {}, self)') 在“数据”中。
    • 所以 Name 从服务器返回?检查网络标签?
    • Ajax 数据恢复正常,只是在包含映射时出现错误。
    • 我的映射 create 函数有问题。要获取数据,您需要使用_data.data。我更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2012-11-05
    • 2018-09-22
    • 2019-09-18
    • 2018-10-17
    相关资源
    最近更新 更多