【问题标题】:knockout mapping object array to observable array and create computed property foreach object剔除将对象数组映射到可观察数组并为每个对象创建计算属性
【发布时间】:2014-01-31 18:52:08
【问题描述】:

我想通过以下方式将一个json数组数据映射到observablearray:

var modell = function() {


    self.activities = ko.observableArray();
    ...


    ko.mapping.fromJS(dataJson, {}, self.activities);
    // as a result I can use self.activities[0].FirstName or other properties
}

每个活动都是复杂的对象。 为简单起见,我们可以假设每个活动中有两个属性 - FirstNameLastName。这很好用,但是可以写吗 将为每个活动创建计算的可观察FullName 的映射选项?

所以,我需要像 self.activities[0].FirstName 和 self.activities[0].FullName 这样的引用,其中 FirstName 是简单可观察的,但 FullName 是计算出来的。

编辑: 这是下面http://jsfiddle.net/5ScWn/ && http://jsfiddle.net/8PK6F/ 建议的一次尝试的JSFiddle,但它仍然不起作用。

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    是的,可以使用映射选项为可观察数组中的每个项目创建计算的可观察对象。请尝试以下操作:

            var mappingOptions = {
                'activities': {
                    create: function (options) {
                        return (new (function () {
                            this.fullName = ko.computed(function () {
                                return this.firstName() + ' ' + this.lastName;
                            }, this);
    
                            ko.mapping.fromJS(options.data, {}, this); // continue the std mapping
                        })());
                    }
                }
            };
    

    然后通过ko.mapping.fromJS(dataJson, mappingOptions, self.activities);使用它

    【讨论】:

    • 我是否遗漏了一些东西,但从未达到过“活动”?这可能是因为 dataJson 没有“活动”映射元素,而是对象数组?
    • 这是我对你的例子的小提琴:jsfiddle.net/5ScWn 或这个jsfiddle.net/8PK6F,在这个例子中我有更复杂的用户对象,它会产生问题吗?
    • @renathy 我更新了你发布的第一个小提琴here。不过,我将计算出的userFullNameUser 对象上移了一层。如果您想将其保留在 User 中,则必须添加 addtl 映射选项来为 Activities 可观察数组中的每个项目创建一个 User 可观察对象。
    猜你喜欢
    • 2014-10-23
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2016-10-28
    • 2018-07-25
    • 1970-01-01
    相关资源
    最近更新 更多