0

在 KnockoutJS 中,我尝试将计算出的 observables 添加到数组的每个项目中:

for (var i = 0; i < items().length; i++) {
    var item = items()[i];
    item.valid = ko.computed(function() {
        var valid = true;
        valid = valid && item.firstName() && item.firstName().length > 0;
        valid = valid && item.lastName() && item.lastName().length > 0;
        return valid;
    });
}

这总是会更新所有出现的valid(),并且仅适用于数组的最后一项。

我认为这是一种上下文问题,但我不明白。

完整的代码可以在这个 jsfiddle中找到。

更新

我在这里找到了基于映射选项的解决方案。

可以在此处找到基于该解决方案的 jsfiddle 。

唉,这需要针对来自 AJAX 的不同数据(根据是否需要有效属性)以不同方式调用映射。

映射完成后有没有办法有效?

4

1 回答 1

0

我更新了你的小提琴,以展示一个更清晰的例子:

http://jsfiddle.net/JasonMore/s9Rmp/2/

这是我现在用于映射的实时代码片段。它可能会帮助您前进。DisplayViewModel 是最终被绑定的父视图模型。

// helpers

var dateConvert = {
    create: function (options) {
        return new Date(parseInt(options.data.substr(6)));
    }
};

var viewModelConvert = function (viewModelType) {
    return {
        create: function (options) {
            return new viewModelType(options.data);
        }
    }
};

// View Models

var layoutViewModel = function (data) {
    var self = this;

    ko.mapping.fromJS(data, {}, this);

    this.ShowText = ko.computed(function () {
        var val = self.ValueType();
        return val !== contentType.Image && val !== contentType.Html;
    });

};

var zoneViewModel = function (data) {
    var self = this;

    ko.mapping.fromJS(data,
        {
            'Layouts': viewModelConvert(layoutViewModel)
        }, this);
};

var presentationViewModel = function (data) {
    var self = this;

    // Mapping
    ko.mapping.fromJS(data,
        {
            'Zones': viewModelConvert(zoneViewModel)
        }, this);
};

var eventViewModel = function (data) {
    var self = this;

    ko.mapping.fromJS(data,
        {
            'Presentations': viewModelConvert(presentationViewModel),
            'EndDateTime': dateConvert,
            'StartDateTime': dateConvert
        }, this);
};

var fontViewModel = function (data) {
    var self = this;

    ko.mapping.fromJS(data, {}, this);

    this.fontFace = ko.computed(function () {
        return "@font-face {font-family: '" + self.Name() + "'; src:url('" + settings.fontUrl + self.FileName() + "')}";
    });
};

var displayViewModel = function (data) {
    var self = this;

    this.init = function () {

    };

    ko.mapping.fromJS(data,
        {
            'Events': viewModelConvert(eventViewModel),
            'Fonts': viewModelConvert(fontViewModel)
        }, this);
};
于 2012-08-28T17:03:39.263 回答