0

KnockoutJSでは、計算されたオブザーバブルを配列の各アイテムに追加しようとしています。

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 に答える