ko.mapping ||无法读取未定义的属性“ fromJS”

时间:2018-09-01 22:43:23

标签: typescript knockout.js knockout-mapping-plugin laravel-mix

我是打字稿新手。我一直在尝试将其与淘汰赛结合使用,但是,我无法使其正常工作。

我已经安装了基因敲除和基因敲除库,还安装了两个库中的@types,即使那样也行不通。

我在laravel项目中使用打字稿,并且在使用laravel mix生成javascript文件。

我得到了下一个片段:

///<reference path="../../../../node_modules/@types/jquery/index.d.ts"/>
///<reference path="../../../../node_modules/@types/knockout/index.d.ts"/>
///<reference path="../../../../node_modules/@types/knockout.mapping/index.d.ts"/>

import * as ko from "knockout";
import * as $ from "jquery";

$(function(){
    //this is only a test to check if ko.mapping exists on the ko object. And no, it doesn't appears.
    console.log("Message from jQuery Done", (ko));
});

class MyModel {
    _data: any;
    constructor(the_data: object)
    {
        let self = this;
        let example_observable = ko.observable(); //This is fine

        ko.mapping.fromJS(the_data, self._data); // This fails with the error -> Cannot read property 'fromJS' of undefined
    }
}

let myModel = new MyModel({"x": "y"});
ko.applyBindings(myModel);

我的package.json包含敲除和敲除映射关系。

    "@types/jquery": "^3.3.6",
    "@types/knockout": "^3.4.58",
    "@types/knockout.mapping": "^2.0.33",
    "ajv": "^6.5.2",
    "knockout": "^3.4.2",
    "knockout.mapping": "^2.4.3",

我不明白我在做什么错。

感谢您的帮助。

谢谢。

2 个答案:

答案 0 :(得分:0)

看来您可能实际上并未将Knockout映射脚本加载到浏览器中。它不是Knockout核心的一部分-它是一个单独的库。

您可以从这里获取它: https://www.npmjs.com/package/knockout-mapping

您可能需要将其包含在页面/包装/包装中。您可以检查是否将其包括在内吗?您引用了类型,但这并不意味着结果页面或捆绑包将自动访问映射库。

作为快速诊断,请尝试在CDN的脚本标签中手动引用它:

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.js"></script>

也只是一个指针-您不需要这样做:

let self = this;

TypeScript更好地处理了“ this”的作用域,因此您可以直接引用“ this”。

答案 1 :(得分:0)

为我工作。也许我正在应用一个错误的解决方案,但绝对可以。

我的问题是“ laravel mix”。

在webpackconfig中,我必须添加下一个:

select td.TaskPK from TaskDetail td
where ( td.CurrentStatus = 'Complete')
Group By td.TaskPK
Having Min(CompleteDate ) >= DATEADD(day, -30, GETDATE())

在我的HTML中必须添加:

mix.webpackConfig({   
    //...
    externals: { // I supossed any "global" libraries goes here.
        'knockout': 'ko'
    }
    //...
});

然后,瞧!

我确实尝试过 mix.autoload ,但是没有用,但是可能是因为我不知道如何使用它。

让我知道这是否是一个愚蠢的答案。我将其取消标记。