ASP.NET WebForms ko.mapping 未定义

ASP.NET WebForms ko.mapping is undefined

我一辈子都弄不明白为什么 ko.mapping 是未定义的。

我正在使用以下 JS 库:

我尝试了以下方法(每次更改后都进行了硬刷新):

  1. 我已经尽我所能重新排序头部的 js 文件。 (认为​​可能在加载库之前调用了 on ready 函数)
  2. 删除了其他 JS 库(认为可能存在某种冲突)
  3. 已将本地文件交换为对敲除映射的 cdn 引用
  4. 创建了一个新文件并将敲除和敲除映射放入其中并将其添加到脚本中以包含
  5. 将合并文件的文件名更改为不包含单词映射(我认为文件名可能有些古怪)

有趣的是,只有两种方法能让我工作起来

如果我将敲除映射复制粘贴到敲除库文件中(但没有名称不同但内容完全相同的新文件)。

我实际上最终做了以下事情:

$(document).ready(function () {
    .
    .
    .
    var loadKnockoutMapping = function () {
        var s = document.createElement('script');
        s.src = '/cstm/JavaScript/knockout.mapping-2.4.1.js';
        document.body.appendChild(s);

        var callbackTimer = setInterval(function () {
            var mappingIsDefined = false;
            try {
                mappingIsDefined = (ko.mapping !== undefined);
            } catch (e) { }

            if (mappingIsDefined) {
                clearInterval(callbackTimer);
                setupRequestableAssignmentData(); //uses ko.mapping.fromJS function
            }
        }, 100);
    }
    loadKnockoutMapping();
}

有人知道这里发生了什么吗?我什至尝试过不向页面添加新的脚本元素,只是一个超时函数来等待 ko.mapping 不是未定义的,但这也没有用 ko.mapping 从未被定义为任何东西。

我认为你是这里的 "re-inventing" 轮子。有一个很棒的图书馆。 http://requirejs.org/

这将为您处理脚本加载。

requirejs.config({
    paths: {
        jquery: 'libs/jquery.js',
        knockout: 'libs/knockout.js',
        knockoutMapping: 'libs/knockoutMapping.js'
    }
    shim: {
        'knockout': {
            deps: ['jquery'],
        }
    }
});


require(["jquery","knockout","knockoutMapping",function($,ko,mapping){
    console.log($,ko,mapping);
});