4

と の 2 つの機能がgenerateありtestます。ユーザーがボタンをクリックすると、ボタンgenerateが呼び出され、test関数が呼び出されます。次のエラーが表示されます。

ko.computed の値を返す関数を渡します。

テスト関数の次の行でエラーがスローされます。

var unmapped = ko.mapping.toJS(this); 

thisko.observable プロパティを持つ私のビューモデルです。

これが2つの機能です。test関数の内容をすべてに移動すると正常にgenerate動作しますが、ロジックを 2 つの異なる関数にする必要があります。私に何ができる?

私はここで非常に立ち往生しています。どんな助けでも大歓迎です。

generate = function () {
            if (!omega.validatableFranchiseGeneration.validate()) {
                return false;
            }
            omega.franchiseInfo.IsForGeneration(true);

            test();
        }

 var test = function () {
        getIpsAndPorts();

        for (var i = 0; i < omega.franchiseInfo.LanguagesInfoViewModel().length; i++) {
            if ($.isArray(omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel)) {
                omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel = omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel[0];
            }
        }

        var unmapped = ko.mapping.toJS(this);

        var jsonData = ko.toJSON(unmapped);
        $.ajax({
            url: "/franchise/Save",
            type: "POST",
            // data: ko.toJSON({ folderName: FolderName }),
            data: { franchiseInfoViewModel: jsonData },
            //traditional: true,
            //contentType: "application/json; charset=utf-8",
            dataType: 'json',
            success: function (data, textStatus, xhr) {
                window.location.href = data.redirectToUrl;
            },
            error: function (request, status, error) {
                jsonValue = jQuery.parseJSON(request.responseText);
                omega.franchiseInfo.errorMessages([]);
                for (var i = 0; i < jsonValue.errorMessages.length; i++) {
                    omega.franchiseInfo.errorMessages.push({ errorMessage: ko.observable(jsonValue.errorMessages[i].ErrorMessage) });
                }
                for (var i = 0; i < omega.franchiseInfo.LanguagesInfoViewModel().length; i++) {
                    InitializeViewLanguagesInfo(omega.franchiseInfo.LanguagesInfoViewModel()[i]);
                }
            }
        });
    }   
4

1 に答える 1

1

thisすべてのコードを確認しないと、これを確認するのは困難ですが、生成に直接含まれているときにコードが (そのままで) 機能する場合は、それが関数内にあるとあなたが考えているものではないことは間違いありませんtest。 関数内でthisは、 内とは異なる意味を持ちます。testgenerate

Chrome または Firebug を起動し、var unmapped = ko.mapping.toJS(this);行にブレークポイントを設定します。プログラムを実行し、ブレークポイントにヒットしたら、コンソールに移動して を確認しthisます。それはあなたのViewModelですか?

あなたthisが内部で期待するものであれば、generateいつでも次のように呼び出すことができますtest

test.apply(this);

thisこれにより、メソッド呼び出しのコンテキストが明示的に設定されます。

もう 1 つのオプションはself、ViewModel 内に変数を設定することです。これは通常、上部で行われ、次のようになりますvar self = this;。この変数を作成することで、self' inside any functions within the outer "function" scope, and not have to worry about the value of変動する this` を参照できます。

--

これは、私が考えていることをシミュレートするための簡単なフィドルです: http://jsfiddle.net/jearles/aLFWe/

Chrome または Firebug コンソールを開き、ログに記録されたオブジェクトを確認します。Windowを呼び出したときはログに記録されたオブジェクトでしたupdatea()Object、元のクリック関数にあり、updateb.apply(this)orを呼び出したときupdatec()( を参照) にあったことに注意してくださいself

于 2012-09-18T11:42:34.227 に答える