2016-01-01 7 views
22

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

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

хотя я получаю:

ERROR: module is not defined

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

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

+0

Какой модуль загрузчика вы используете? (systemjs? webpack? browsify?) – alexpods

+0

Я не верю, что ваша проблема имеет какое-либо отношение к относительным URL-адресам. Это работает, если вы поместите шаблон в декоратор '@ Component' вместо отдельного файла? –

+0

Я использую systemjs. @MichaelOryl Все работает хорошо, если удалить moduleId и использовать абсолютный URL-адрес, а не относительный, или если я поместил код шаблона вместо отдельного файла. – Sagi

ответ

12

Это, похоже, не работает для меня. I can see in the Github repo для Angular 2, что функция предположительно была добавлена ​​в начале декабря, но она не работает, насколько я могу судить.

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

Update:

Вот часть того, что происходит. This requires a CommonJS specific feature, так что вам нужно иметь эту систему модулей, которая используется в файле tsconfig.json.

Кроме того, there's an issue when using SystemJS из-за того, что он связывает все с корнем.

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

+1

Я пробовал играть с ним, например, указывая commonjs как модуль в typescriptOptions, но все равно не хожу. Вы смогли заставить его работать? – Sagi

+0

@Sagi Я, конечно, никогда не получал относительных путей для работы. –

+0

Я использую commonJs, мои файлы HTML/ts находятся в папке 'app', но скомпилированы файлы ir' js' в другой папке 'dist', откуда запускалось мое приложение, теперь, когда я использую' moduleId: module.id', взял путь от «dist/blabla ...», но там angular2 обнаружил только файлы .js', а не HTML, теперь, как сказать, что угловой взять путь из папки src вместо папки dist? –

3

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

error TS2304: Cannot find name 'module'.

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

declare var module: { 
    id: string; 
}; 
+0

где добавить эти строки в файл 'tsConfig.json'? –

+0

@PardeepJain, я создал для этого еще один файл. Вы можете посмотреть на примере [здесь] (https://github.com/Nicolai8/Blog/blob/master/public/ts/custom-typings/commonjs.d.ts) – Nicolai

+0

Я пытаюсь присвоить значение ' id', но угловой не позволит почему? Я хочу этот http: // stackoverflow.com/q/36451917/5043867 –

4

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

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

Пробовал это, однако я тогда получил 'Error: ReferenceError: require не определено' в: angular2-polyfills.js – Beevee

+0

интересная идея, однако это означает, что require требует загрузить строку вместо javascript, который я не думаю, что он делает по умолчанию. возможно, это работает с http://www.bennadel.com/blog/2277-using-the-text-plugin-with-requirejs-to-load-remote-html-templates.htm, но это кажется слишком большой работой для это. –

+0

Он работает для меня с webpack. Я не пытался с systemjs. – domen

-1

Поскольку этот вопрос получает много внимания - я выложу ссылку к хорошей статье в ОФИЦИАЛЬНОГО ANGULAR CookBook: Component-relative Paths

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

1

Просто установите свойство moduleId компонента Component с его значением module.id. Обратитесь к примеру здесь: https://angular.io/docs/ts/latest/cookbook/component-relative-paths.html#!#set-the-moduleid-

Пример кода: @Component ({ moduleId: module.id, селектор: 'Войти', templateUrl: "login.component.html" })

Работал для меня.

+0

Да, только с «стартером» в качестве шаблона и этим советом мне удалось заставить его работать – user230910

+0

его странно, вы ожидали бы, что нужно определить этот объект «модуля» где-нибудь или ожидать увидеть его как часть официального учебника, но здесь мы .. – user230910

+0

Неработающая ссылка ..... – tom10271

5

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

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

"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' 
}) 

Надеюсь, что эта помощь.

-1

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

Добавьте узел в свой 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" 
    } 
} 

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

-2

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

@Component ({ селектор: 'Логин-приложение', templateUrl: 'приложение/app.html' })

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

0

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

declare var __moduleName: string; 

@Component({ 
    selector: 'login-app', 
    moduleId: __moduleName, 
    templateUrl: './app.html' 
}) 
Смежные вопросы