ko.mapping || Невозможно прочитать свойство 'fromJS' из неопределенного - PullRequest
0 голосов
/ 02 сентября 2018

Я новичок в машинописи. Я пытался использовать knockout.mapping, но не могу заставить его работать.

Я установил библиотеки knockout и knockout.mapping, а также @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 включает в себя зависимости knockout и knockout.mapping.

    "@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 голосов
/ 03 сентября 2018

Это работа для меня. Возможно, я применяю плохое решение, но оно определенно работает.

Моя проблема была с "Laravel Mix".

В webpackconfig я должен добавить следующее:

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

В моем HTML нужно добавить:

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

И, вуаля!

Я попробовал mix.autoload и не сработало, но, возможно, потому что я не знаю, как его использовать.

Дайте мне знать, если это глупый ответ. Я отмечу это.

0 голосов
/ 03 сентября 2018

Похоже, вы на самом деле не загружаете скрипт отображения 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».

...