Использование относительного пути для templateUrl в Компоненте с SystemJS

Я пытаюсь использовать относительный путь при определении templateUrl в компоненте angular2, как описано здесь: http://schwarty.com/2015/12/22/angular2-relative-paths-for-templateurl-and-styleurls/

@Component({
    selector: 'login-app',
    moduleId: module.id,
    templateUrl: './app.html'
})

хотя я продолжаю получать:

ОШИБКА: модуль не определен

Я использую --m commonjs в настройках компиляции TypeScripy.

Как заставить это работать?

Ответ 1

Это просто не работает для меня. Я вижу в репозитории Github для Angular 2, что функция предположительно была добавлена ​​в начале декабря, но она не работает, насколько я могу судить.

Документы не были обновлены, чтобы отразить это, и по-прежнему не хватает надлежащих тестов из того, что я могу сказать.

Update:

Здесь часть того, что происходит. Для этого требуется специальная функция CommonJS, поэтому вы должны использовать эту систему модулей в файле tsconfig.json.

Кроме того, возникает проблема при использовании SystemJS из-за того, как он связывает все с корнем.

В принципе, существует множество ограничений на возможность использования этой новой функции.

Ответ 2

Вы можете попробовать выполнить следующие действия:

Шаг 1. Объявляет объект модуля формата commonjs, который идентифицирует "id модуля" для текущего модуля.

"compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    ...
}

Шаг 2: Добавление typings.d.ts в папку wwwroot для идентификации "id модуля".

/// <reference path="../typings/globals/core-js/index.d.ts" />
 declare var module: { id: string };

Шаг 3. Установите для компонента moduleId свойство метаданных значение module.id для относительных URL-адресов (обратите внимание на соглашение).

@Component({
    selector: 'login-app',
    moduleId: module.id,
    templateUrl: 'app.component.html'
})

Надеюсь на эту помощь.

Ответ 3

Обходной путь: используйте require с шаблоном вместо templateUrl

@Component({
    selector: 'login-app',
    template: require('./app.html')
})

Ответ 4

У меня была та же проблема:

Ошибка TS2304: Не удается найти имя 'module'.

по некоторым причинам, даже при "module": "commonjs" в compilerOptions в tsconfig.json файле TypeScript повышается эта ошибка. Поэтому я решил проблему, добавив для нее объявление:

declare var module: {
    id: string;
};

Ответ 6

С systemjs сначала объявите строку __moduleName (два символа подчеркивания), а затем используйте ее вместо module.id следующим образом:

declare var __moduleName: string;

@Component({
    selector: 'login-app',
    moduleId: __moduleName,
    templateUrl: './app.html'
})

Ответ 7

По мере того как этот вопрос получает много внимания, я отправлю ссылку на хорошую статью в ОФИЦИАЛЬНО ANGULAR COOKBOOK: Относительные контуры компонентов

В нем объясняется , почему по умолчанию используются абсолютные пути и , как использовать относительные пути в зависимости от стратегий загрузки упаковки и модулей.

Ответ 8

Модуль

фактически определен внутри index.d.ts в node.

Добавьте node в свой typings.json, как показано ниже, и запустите "npm run typings install".

{
  "globalDependencies": {
    "core-js": "registry:dt/core-js#0.0.0+20160602141332",
    "jasmine": "registry:dt/jasmine#2.2.0+20160621224255",
    "node": "registry:dt/node#6.0.0+20160621231320"
  }
}

Это должно решить вашу проблему.

Ответ 9

Использовать абсолютный путь к html файлу при использовании temlplateUrl. например: Если ваша иерархия приложений - это MyApp- > app- > yourComponent.ts и на уровне приложения, ваш app.html там, то обратитесь к Component decorator yourComponent.ts следующим образом, он должен работать.

@Component ({   селектор: "login-app",   templateUrl: 'app/app.html' })

относительный путь никогда не работал у меня, даже после установки moduleID на module.id или любой другой работы. Если это действительно работает для всех, пожалуйста, разделите.