1

私は次のものを持っています:

// Child Array is Cards, trying to add computed observable for each child
var CardViewModel = function (data) {
    ko.mapping.fromJS(data, {}, this);
    this.editing = ko.observable(false); 
};

var mapping = {  
    'cards': {  // This never gets hit, UNLESS I remove the 'create' method below
        create: function (options) {
            debugger;
            return new CardViewModel(options.data);
        }
    },

    create: function(options) {
        var innerModel = ko.mapping.fromJS(options.data);
        innerModel.cardCount = ko.computed(function () {
            return innerModel.cards().length;
        });
        return innerModel;
    }
};

var SetViewModel = ko.mapping.fromJS(setData, mapping);
debugger;
ko.applyBindings(SetViewModel);

ただし、「cards」バインディングを機能させることはできません。「create」メソッドを削除しない限り、そのコードに到達しません。私はノックアウトサイトの例に従おうとしています:

http://knockoutjs.com/documentation/plugins-mapping.html

子オブジェクト定義に対してこれを行います。

var mapping = {
    'children': {
        create: function(options) {
            return new myChildModel(options.data);
        }
    }
}
var viewModel = ko.mapping.fromJS(data, mapping);

このように定義されたChildModelを使用して:

var myChildModel = function(data) {
    ko.mapping.fromJS(data, {}, this);

    this.nameLength = ko.computed(function() {
        return this.name().length;
    }, this);
}

私はこれに過去1日を費やしましたが、これが機能しない理由を一生理解することはできません。どんなヒントも素晴らしいでしょう。

編集:これが私が取り組んでいるもののフィドルです。ここでは「編集」が認識されないため、結果にはSIDE1のみが表示されます。

<div data-bind="visible: !$parent.editing()" class="span5 side-study-box">

http://jsfiddle.net/PTSkR/1/

これは私がそれを実行したときに私がクロームで得るエラーです:

キャッチされないエラー:バインディングを解析できません。メッセージ:TypeError:オブジェクトにはメソッド'editing'がありません。バインディング値:表示:!$ parent.editing()

4

2 に答える 2

2

createビューモデルの動作をオーバーライドしました。マッピングプラグインは、プロパティの他のハンドラーを呼び出しません。メソッド内からマッピングしているので、ハンドラーをそこcreateに移動します。cards

var mapping = {  
    create: function(options) {
        var innerModel = ko.mapping.fromJS(options.data, {
            'cards': {
                create: function (options) {
                    debugger;
                    return new CardViewModel(options.data);
                }
            }
        });
        innerModel.cardCount = ko.computed(function () {
            return innerModel.cards().length;
        });
        return innerModel;
    }
};

更新されたフィドル

于 2013-03-24T19:36:09.653 に答える
-1

かっこを付ける必要はありませんでした。から変更しました

!$parent.editing() 

 to 


!$parent.editing

ここで更新されたフィドルを参照してください

于 2013-03-24T19:34:47.523 に答える