работа с sammyjs typescript и systemjs

Я пытаюсь создать простое приложение маршрутизации, используя sammyjs, написанный на Typescript, и systemjs в качестве загрузчика модулей.

Однако столкнулся с проблемами с загрузкой sammy.

Ниже приведены фрагменты кода

Конфигурация SystemJs

System.config({
  transpiler: "typescript",
  defaultJSExtensions: true,
  map: {
    "knockout": "../bower_components/knockout/dist/knockout",
    "sammy": "../bower_components/sammy/lib/sammy",
    "jquery": "../bower_components/jquery/dist/jquery"
  }
});

Поставщик маршрутов

import { Route } from "./types";
import * as Sammy from "sammy"

export class RouteProvider {
    sammyApp: Sammy.Application;
    defaultRoute: string;

    constructor() {
  }

  configureRoutes = (routes: Array<Route>) => {        
    this.sammyApp = Sammy(() => {
        routes.map((_route: Route) => {
            this.sammyApp.get('#' + _route.path, (context) => {
                _route.callBack(context);
            });
        })
    });

    this.sammyApp.run('#' + this.defaultRoute);
  }
}

Когда я инициализирую класс RouteProvider и вызываю метод configureRoutes, я получаю следующую ошибку:

Uncaught TypeError: Сэмми не является функцией

Я проверил вкладку сети в браузере, и sammy.js был загружен. Также я получаю правильные определения типов, и нет ошибки компиляции Typescript.


person Madhu Ranjan    schedule 25.04.2016    source источник
comment
Вы импортируете все из sammy как объект Sammy, ваша функция должна быть атрибутом этого объекта, а не самим объектом, т.е. Sammy.someFunction()   -  person Ozrix    schedule 26.04.2016
comment
console.log выведи, что внутри объекта Сэмми, я уверен, ты заметишь, что не так   -  person Ozrix    schedule 26.04.2016
comment
@Ozrix: я зарегистрировал объект Sammy в консоли, это объект, Object {VERSION: 0.7.6, __useDefault: true}, не знаю, как его использовать, я просмотрел sammy [исходный файл [(github.com/quirkey/sammy/blob/master/lib/sammy.js) это кажется, что экспортированный объект Sammy является функцией   -  person Madhu Ranjan    schedule 26.04.2016
comment
ладно, можешь выложить, что выдает?   -  person Ozrix    schedule 26.04.2016
comment
@Ozrix: я зарегистрировал объект Sammy в консоли, это объект, Object {VERSION: 0.7.6, __useDefault: true}, не знаю, как его использовать, я просмотрел sammy [исходный файл [(github.com/quirkey/sammy /blob/master/lib/sammy.js) кажется, что экспортированный объект Sammy является функцией —   -  person Madhu Ranjan    schedule 26.04.2016
comment
я попытаюсь воспроизвести вашу проблему на своем рабочем месте и дам вам знать   -  person Ozrix    schedule 26.04.2016


Ответы (1)


Хорошо, похоже на это заявление

import * as Sammy from "sammy"

фактически преобразует функцию в объект. Делая это вместо

Sammy = require("sammy");

он работает, т.е. Sammy выводит как функцию. Надеюсь это поможет.

person Ozrix    schedule 26.04.2016
comment
требуя sammy, как указано выше, не удается загрузить модуль, system.js: 4 Uncaught (в обещании) Ошибка: Ошибка: модуль еще не загружен, загружая sammy как localhost:51652/bower_components/sammy/lib/sammy Я заметил, что в требуемом URL-адресе нет расширения js Я пытался использовать метатег для загрузки это как amd, но не повезло, мета: { '../bower_components/sammy/lib/sammy': {format: 'amd', exports: 'Sammy', deps: ['jquery'] } - person Madhu Ranjan; 26.04.2016
comment
как выглядит конфигурация вашего машинописного компилятора (tsc)? Вам нужно использовать компиляторOptions: {module: system}, если вы используете tsconfig.js, или tsc --module system - person Ozrix; 26.04.2016
comment
Вот параметры компилятора tsc: { target: ES5, outDir: dist, module: system, moduleResolution: node, sourceMap: false, emitDecoratorMetadata: true, ExperimentDecorators: true, removeComments: false, noImplicitAny: false} - person Madhu Ranjan; 26.04.2016
comment
извините, у меня закончились патроны. у меня сработал метод require, я не уверен, куда идти дальше, так как ваша конфигурация машинописного текста выглядит нормально - person Ozrix; 27.04.2016