【问题标题】:ASP.NET WebForms ko.mapping is undefined [closed]ASP.NET WebForms ko.mapping 未定义 [关闭]
【发布时间】:2015-09-25 04:12:57
【问题描述】:

我一生都无法弄清楚为什么 ko.mapping 未定义。

我正在使用以下 JS 库:

  • jquery
  • 淘汰赛
  • knockout.mapping
  • 时刻
  • 完整日历
  • 数据表
  • datatables.columnFilter
  • dataTables.scroller
  • jquery.blockUI

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

  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 从未最终被定义为任何东西。

【问题讨论】:

  • 我对您的情况表示同情,但恐怕没有复制品(-我知道-对于此类问题,真的很难创建)我们只能求助猜测问题是什么。
  • 你试过调高计时器吗?也许 100 毫秒不足以等待。
  • @Jeroen 是的,我认为最令人沮丧的部分是我在同一个项目的不同页面上使用了相同的库组合。或许我可以一块一块地重建页面,看看是否能找到根本原因,然后在这里发布解决方案。
  • @JeffMercado 回调每 100 毫秒运行一次,直到找到定义的 ko 映射,因此增加该计时器只会使其检查频率降低

标签: javascript jquery asp.net knockout.js knockout-mapping-plugin


【解决方案1】:

我认为您在这里“重新发明”了轮子。有一个很好的图书馆。 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);
});

【讨论】:

  • 是的,这是解决手头问题的另一个很好的解决方案,但实际上我更希望能够在页面上包含文件。作为我提出的解决方案,这个解决方案都是一次性的,并且与我们其他页面的方式不一致。无论如何,谢谢,我可能会将我的 hack 切换到这个
猜你喜欢
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
相关资源
最近更新 更多