2

10 の異なるセクションを持つ巨大なページを構築しており、イベント バインディングなどに Knockout を使用しています。

各セクションには、フィールドと検証プロパティなどを備えた独自のviewModelを含むフォームが含まれています。マルチビューモデルに関するこの投稿を読んだ後、パターン化しました。

多くの subViewModel をインポートする masterViewModel があります。これはすべて正常に機能しており、フィールド入力などで自動入力される監視可能な要素を設定できます.

以下のように、フォーム送信をviewModelの関数にバインドしています。

フォーム フィールドを (ajax 投稿経由で) 検証して保存した後、セクションを読み取り専用モードにしたいのですが、ajax 呼び出しの成功コールバックで viewModel のハンドルを取得する方法がわかりません。

<form action="webservice.php" method="POST" data-bind="submit: contactInformation.validateSubmit">


this.validateSubmit = function(formElement){

    var result = ko.validation.group(this, {deep: true});
    if (!this.isValid()) {
        result.showAllMessages(true);
        return false;
    }

    //actually save stuff, call ajax, submit form, etc;
    //  setup a promise
    var posting = $.post( "./webservice.php", $(formElement).serialize() );

    posting.done(function( data ) {
        this.contactInformation.model_state("summary"); // Uncaught TypeError: Cannot call method 'model_state' of undefined 
        // i also tried the line below, instead of line above...
        ko.mapping.updateFromJS(this, data); // Uncaught TypeError: Cannot call method 'updateFromJS' of undefined 
    });

};

誰もこれを行う方法を知っていますか? contactInformation.validateSubmit() 関数からの formElement のハンドルがあります。どこかでリスナーを手動でサブスクライブする必要がありますか? または、モデルを $(formElement).data('model') から切り離す方法はありますか?

どんな助けでも大歓迎です。

ありがとう、 -- スコット

4

3 に答える 3

0

私はあなたが最初に尋ねたことを次のようにしました:

<form id="registration-form" data-bind="submit: CreateUser.bind($root,$data)" method="POST">
于 2013-09-02T19:20:27.380 に答える
0

ジョセフの方法はうまくいったかもしれませんが、テストする前に、送信ハンドラーを削除し、代わりに、モデルへのハンドルが含まれているため、保存/編集ボタンのクリック ハンドラーを使用しました。次に、モデルごとに保存および編集機能があり、各モデルがモデル間で同じことを行うことに気付いたので、それを masterViewModel に移動しました。次に、それらを参照します

data-bind: "click: $root.save"

次に、その保存メソッドには、その送信関数のほとんどのものと、model_state プロパティを設定するための情報が含まれています。

    this.save = function(model, event) {
        log(model);

        var $form = $(event.target).closest('form');

        var result = ko.validation.group(this, {deep: true});
        if (!this.isValid()) {
            result.showAllMessages(true);
            return false;
        }

        //actually save stuff, call ajax, submit form, etc;
        var posting = $.post( $form.attr("action"), $form.serialize() );

        posting.done(function( data ) {
            if (data.status === "success") {
                model.model_state("summary");
            } else {
                if (data.errors) {
                    // display errors
                }
            }
        });
    };
于 2013-05-14T17:08:33.897 に答える