Javascript IE9中未检测到视图模型函数绑定,但在FF和Chrome中有效

Javascript IE9中未检测到视图模型函数绑定,但在FF和Chrome中有效,javascript,knockout.js,revealing-module-pattern,Javascript,Knockout.js,Revealing Module Pattern,更新 我意识到,考虑到实施,这个问题很难理解。查看和测试工作样本 要进行测试,必须使用IE9,并且开发工具不能打开。打开开发工具将使项目按预期工作。此解决方案适用于任何其他浏览器。为了进行测试,我在IIS中本地设置了解决方案,并在VS/debug外部运行它 我有一个项目,我正试图保存一个击倒观察回服务器。我在IE9中看到了一些我无法解释的非常奇怪的事情,我希望有人能帮助我。 我正在使用Asp.NETMVC和knockout,并为项目的这一部分实现了JS显示模块模式。 我的js文件如下: Re

更新 我意识到,考虑到实施,这个问题很难理解。查看和测试工作样本

要进行测试,必须使用IE9,并且开发工具不能打开。打开开发工具将使项目按预期工作。此解决方案适用于任何其他浏览器。为了进行测试,我在IIS中本地设置了解决方案,并在VS/debug外部运行它


我有一个项目,我正试图保存一个击倒观察回服务器。我在IE9中看到了一些我无法解释的非常奇怪的事情,我希望有人能帮助我。 我正在使用Asp.NETMVC和knockout,并为项目的这一部分实现了JS显示模块模式。 我的js文件如下:

  • Reportwriter.js与html的基本绑定,用于显示模式
  • reportWriteEffects.js这包含UI生成并传递给knockout Viewmodel的任何事件
  • ReportWriterUtilities.js。它包含Viewmodel中的数据/对象操纵功能
  • ReportWriteServiceModel.js Reportwriter viewmodel Json序列化/序列化
我的html页面包含以下元素

<a id="footerSaveButton" class="blackGradient panelBtn pleft" >
这应该依次从
reportWriteServiceWModel.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);
            }
它将我的可观察报告传递到ReportWriterUtility.js文件,在该文件中进行ajax调用

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);
    }
    });
}
还是没有骰子

如果您查看ajax调用,您还将看到我在哪里添加了
cache:false
认为这可能会有所帮助。还是没什么

我添加了警报消息,但没有调用上下文。$root.Save();从来没有人打过电话

现在是一件非常奇怪的事情。当我在IE9中加载页面并按F12在IE中打开开发工具,然后关闭开发工具时,调用viewmodel中的保存功能,一切正常。如果我启动浏览器打开开发工具并导航到该页面,一切正常。控制台中不会生成任何错误或消息,在其他浏览器中也可以正常工作。这对IE9来说似乎是孤立的,因为IE10工作得很好


有人有什么建议吗?或者你过去经历过类似的事情吗。我希望能深入了解造成这种情况的原因。我希望下面的代码足够了。我不能使用fiddle,因为我在这里使用的是显示模式,它不能准确地表示代码。

在IE8&9中,
控制台
是未定义的,只要F12开发人员工具尚未为当前文档初始化(afaik,firebug的旧版本也会遇到这种情况)

您的
self.Save
似乎在
console.log('VM-reated')上失败。可能还有其他地方,但这是artisan静态代码分析所能提供的(无法访问VisualStudio IDE…或信任未经验证的解决方案:)

只要
console
调用从生产代码中剥离,您就可以在开发人员工具打开的情况下继续开发业务,这将是我个人的偏好

或者,您可以选择使用noop(一种不执行任何操作的方法)来“插入”控制台方法:


也值得注意,因为它插入了其他控制台方法。

在IE8&9中,
console
是未定义的,只要F12开发人员工具尚未为当前文档初始化(afaik,firebug的旧版本也会遇到这种情况)

您的
self.Save
似乎在
console.log('VM-reated')上失败。可能还有其他地方,但这是artisan静态代码分析所能提供的(无法访问VisualStudio IDE…或信任未经验证的解决方案:)

只要
console
调用从生产代码中剥离,您就可以在开发人员工具打开的情况下继续开发业务,这将是我个人的偏好

或者,您可以选择使用noop(一种不执行任何操作的方法)来“插入”控制台方法:


也值得注意,因为它插入了其他控制台方法。

TL:DR-您可能遇到了问题,因为您试图使用jQuery进行事件处理来调用knockout。摆脱click绑定,并使用ko@PWKad这就是我最初设置它的方式。@rlcrews内部:恐怕这与
ko
或特定模式无关。欢迎光临!TL:DR—您可能遇到了问题,因为您试图使用jQuery进行事件处理来调用knockout。摆脱click绑定,并使用ko@PWKad这就是我最初设置它的方式。@rlcrews内部:恐怕这与
ko
或特定模式无关。欢迎来到!@o、 这就是问题所在。在我的一个验证函数中嵌套了一个console.log事件。从来没有人会想到这是个问题,但事实确实如此。感谢您在这些版本的中对控制台未定义的深入了解browser@rlcrews当前位置听到这个消息我很高兴。不久前,我们遇到了类似的问题,MSDN似乎仍然对这一问题和其他问题一无所知。IMHO,有多少开发者正在购买整个“IE9+是一款非常棒的浏览器!”营销活动,这真是令人着迷。@o.v这就是问题所在。在我的一个验证函数中嵌套了一个console.log事件。从来没有人会想到这是个问题,但事实确实如此。感谢您在这些版本的中对控制台未定义的深入了解browser@rlcrews当前位置听到这个消息我很高兴。不久前,我们遇到了类似的问题,MSDN似乎仍然对这一问题和其他问题一无所知。我的意思是,有多少开发者正在购买整个“IE9+是一款非常棒的浏览器!”营销活动,这真是令人着迷。
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);
    }
    });
}
[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public class ReportLibraryController : RootController
{ ...
/*https://stackoverflow.com/a/9593812/1081234*/
if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function () { };