0

更新 実装を考えると、この質問に従うのは難しいと思います。実際のサンプルを見てテストするには、ソリューションをダウンロードしてください。

テストするには IE9 を使用する必要があり、開発ツールを開くことはできません。開発ツールを開くと、プロジェクトが期待どおりに機能します。このソリューションは、他のブラウザでも問題なく機能します。テストのために、ソリューションを IIS 内でローカルにセットアップし、VS /debug の外で実行しました。


ノックアウトオブザーバブルをサーバーに保存しようとしているプロジェクトがあります。IE9 で、説明できない本当に奇妙なことがいくつか見られます。誰かが私を助けてくれることを願っています。私はノックアウトと共に Asp.NET Mvc を使用しており、プロジェクトのこの部分の JS 公開モジュール パターンを実装しています。私のjsファイルは次のとおりです。

  • パターンを明らかにするためのReportwriter.jsのhtmlへの基本的なバインディング
  • ReportWriterEffects.js これには、UI が生成し、ノックアウト ビューモデルに渡されるすべてのイベントが含まれます。
  • ReportWriterUtilities.js. これには、ビューモデル内のデータ/オブジェクト操作のための関数が含まれています
  • ReportWriterViewModel.js ReportWriter ビューモデル Json シリアライゼーション/シリアライゼーション。

私のhtmlページには次の要素があります

<a id="footerSaveButton" class="blackGradient panelBtn pleft" >

これをクリックすると、目立たないイベントがReportWriterEffects.js

 $(document).on({

            click: function () {
                alert('click');// placed here for testing
                var context = ko.contextFor(this);
                context.$root.Save();
            }
        }, '#footerSaveButton');

ReportWriterViewModel.jsこれは、次のように見えるから順番に呼び出す必要があります

self.Save = function () {
            if (self.ValidateReport()) {

                // Transform the custom types in the myFilters collection into the form required by the server-side representation.
                self.TransformFilters();
                ReportWriterUtilities.Save(self.iqReport);
            }

ajax呼び出しが行われるreportWriterUtilities.jsファイルに私のレポートオブザーバブルを渡します

function Save(reportObservable) {
  // Determine which method to call based upon the state of report modification.
  var command = reportObservable().IsNewReport() ? "SaveNewReport" : "UpdateExistingReport";
$.ajax({
    type: "POST",
    url: "../" + command,
    data: "{ json:'" +
    ko.toJSON(reportObservable, function (key, value) { // Remove the __type attribute. This causes problems with deserialization.
        if (key == "__type") {
            return;
        }
        else {
            return value;
        }
    }) + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    cache: false,
    success: function (msg) {
        if (msg.Key != null) {
            // Update the ViewModel with properties from the saved Report.
            reportObservable().ReportId(msg.Key.ReportId);
            reportObservable().DateLastModified(msg.Key.DateLastModified);

            AlertMessaging.DisplaySuccess("Report Saved!", 'Your Report has been saved and is available in your Report Library. <i><a target="_self" href="../../ReportLibrary">Go to Report Library</a></i>');
        }
        else {
            // Display an error with the given text.
            AlertMessaging.DisplayError("Problem Saving Report", msg.Value);
        }
    }, error: function (err) {
        AlertMessaging.DisplayError("Error Saving Report", "The Server returned an error code. Code: " + err.status);
    }
    });
}

Firefox と Chrome では、これはすべて機能し、レポートは保存されます。ただし、IE 内では、save 呼び出しは呼び出されません。<a>私はもともと、決して呼び出されなかった要素にノックアウトバインドを設定していました。Mvcを使用していたので、ブラウザのキャッシュがこれに影響を与えている可能性があると考えたので、コントローラーのコンストラクターに次の属性を追加して、キャッシュをロードしないようにコントローラーを装飾しました

[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public class ReportLibraryController : RootController
{ ...

まだサイコロはありません。

ajax 呼び出しを見ると、私が追加したcache: false考えが役立つ可能性があることもわかります。まだ何もありません。

アラートメッセージを追加しましたが、それは呼び出されますが、context.$root.Save(); 呼び出されることはありません。

ここに本当に奇妙なことがあります。IE9 でページをロードし、F12 を押して IE で開発ツールを開き、開発ツールを閉じると、viewmodel 内の保存機能が呼び出され、すべてが機能します。ブラウザーを開いて開発ツールを起動し、ページに移動すると、すべてが機能します。コンソールにエラーやメッセージは生成されず、他のブラウザー内ではすべて正常に動作します。IE 10 は正常に動作するため、これは IE9 に分離されているようです。

誰か提案がありますか、過去にこのようなことを経験したことがありますか. これが発生する原因についての洞察をいただければ幸いです。以下のコードで十分だと思います。ここでは明らかにするパターンを使用しており、コードを正確に表現できないため、フィドルを使用できません。

4

1 に答える 1

4

IE8&9 ではconsole、現在のドキュメントに対して F12 開発者ツールが初期化されていない場合は常に未定義です (古いバージョンの firebug もこれに悩まされていました)。

ReportWriterViewModel.js (13)self.Save失敗したようです。他の場所もあるかもしれませんが、これは私の職人の静的コード分析が私を得る限りです(VisualStudio IDEへのアクセスなし...または未検証のソリューションへの信頼:)console.log('VM reached');

console開発者ツールを開いた状態で通常どおり開発を続けることができますが、呼び出しが本番コードから取り除かれている限り、これは私の個人的な好みです。

または、noop (何もしないメソッド) でコンソール メソッドを「プラグ」することもできます。

/*https://stackoverflow.com/a/9593812/1081234*/
if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function () { };

この回答は、他のコンソール メソッドをプラグインするため、注目に値します。

于 2013-11-25T01:59:08.477 に答える