Передайте постоянные значения в Angular от layout.cshtml по
Итак, у меня есть постоянные переменные в файл _Layout.cshtml ASP.Net СПА-проект, и я бы передал их так, чтобы у Angular был доступ к ним.
Как я могу это сделать?
например, вот одно значение, которое я пытаюсь передать.
var lenderValues = @Html.Action("GetLenderDropdownValues", "Dropdown");
а вот как мое первое приложение.компонент загружается.
<my-rite-ui>Loading...</my-rite-ui>
Я знаю, как это сделать в AngularJS 1.x только с константой и инъекцией этой константы, где это необходимо, но не может выясните это в Angular.
любая помощь будет высоко ценится.
3 ответов
это зависит от того, что вы хотите точно сделать, но я вижу две возможности:
- определить константу
эта константа должна быть передана при импорте вашего основного модуля. В то время как это невозможно сделать на . Вы можете импортировать функцию и вызывать ее с параметрами.
вот пример основного модуля, который загружает ваше приложение:
import {bootstrap} from '...';
import {provide} from '...';
import {AppComponent} from '...';
export function main(lenderValues) {
bootstrap(AppComponent, [
provide('lenderValues', { useValue: lenderValues })
]);
}
затем вы можете импортировать его из ваша главная страница HTML выглядит так:
<script>
var lenderValues = @Html.Action("GetLenderDropdownValues", "Dropdown");
System.import('app/main').then((module) => {
module.main(lenderValues);
});
</script>
код lenderValues
затем можно вводить во все элементы, такие как компонент:
@Component({
(...)
})
export class SomeComponent {
constructor(@Inject('lenderValues') lenderValues) {
}
}
- определить параметр
my-rite-ui
элемент
вы можете указать параметр на этом уровне, но он не может быть оценен. Так что это немного более утомительно, так как вам нужно сериализовать его как строку с JSON.stringify
, получает элемент в компоненте с тегом ElementRef
и десериализовать его с помощью JSON.parse
.
затем вы можете добавить данные в качестве поставщика.
первый ответ выше был моим любимым, если вы используете компиляцию JIT. Мы используем JIT для разработки и AOT для развертывания. Я не мог найти хороший способ заставить первый ответ работать с AOT. Для справки я следовал поваренной книге AOT здесь... угловой AOT поваренная книга.
подход ниже не будет работать для рендеринга на стороне сервера, но должен быть достаточным для рендеринга на стороне клиента JIT и AOT.
1) в виде бритвы, _layout.cshtml ПО для например, просто поместите блок скрипта и установите объект JSON в интерфейсе окна. Я поместил этот блок в тег "head", но это не имеет значения. Значения для ключей JSON можно определить с помощью любого синтаксиса razor.
<script type="text/javascript">
window.appContext = {
userName: '@("test".ToUpper())',
isAdmin: @(1 == 1 ? "true" : "false")
};
</script>
2) Создайте службу контекста приложения и подключите соответствующий модуль и вставьте в компоненты для использования, если вам нужна помощь с этим просто комментарием, и я предоставлю больше информация.
import { Injectable } from '@angular/core';
/*
must match definition in SCRIPT tag that is seeded from razor
*/
interface IAppContext {
userName: string;
isAdmin: boolean;
}
/*
*/
@Injectable()
export class AppContextService implements IAppContext {
userName: string;
isAdmin: boolean;
constructor() {
var appContextBootstrap: IAppContext = (<IAppContext>(<any>window).appContext);
this.userName = appContextBootstrap.userName;
this.isAdmin = appContextBootstrap.isAdmin;
}
}
3) ссылка и использование службы контекста приложения во всем приложении.
import { Component } from '@angular/core';
import { AppContextService } from './appContext.service'
@Component({
moduleId: module.id,
selector: 'story-app',
templateUrl: 'app.component.html'
})
export class AppComponent {
AppConfig: any;
constructor(private appContext: AppContextService) { }
ngOnInit() {
alert('hi - ' + this.appContext.userName);
}
}
в чем проблема? Я легко получаю значение с такой HTML-страницы.
HTML-код
<script type="text/javascript">
var getThisValue='I want this string in component';
</script>
<html>
<head>
<base href="/">
<title>Angular 2 - Tour of Heroes</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="styles.css">
<!-- 1. Load libraries -->
<!-- Polyfill(s) for older browsers -->
<script src="node_modules/es6-shim/es6-shim.min.js"></script>
<script src="node_modules/zone.js/dist/zone.js"></script>
<script src="node_modules/reflect-metadata/Reflect.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<!-- 2. Configure SystemJS -->
<script src="systemjs.config.js"></script>
<script>
System.import('app').catch(function(err){ console.error(err); });
</script>
<script type="text/javascript">
var getThisValue='I want this string in component';
</script>
</head>
<!-- 3. Display the application -->
<body>
<my-app>Loading...</my-app>
</body>
</html>
вызов главного файла компонента
alert(getThisValue);
import { bootstrap } from '@angular/platform-browser-dynamic';
import { HTTP_PROVIDERS } from '@angular/http';
import { AppComponent } from './app.component';
//import { enableProdMode } from '@angular/core';
//enableProdMode();
bootstrap(AppComponent, [HTTP_PROVIDERS]);
alert(getThisValue);
это работа для меня
на то, что я заметил в вашем коде, вы должны использовать ''
отметка для доступа к url.
заменить
var lenderValues = @Html.Action("GetLenderDropdownValues", "Dropdown");
С это
var lenderValues = '@Html.Action("GetLenderDropdownValues", "Dropdown")';
это самый простой вариант доступа к значению из HTML
конечно не правильный способ. Чтобы получить доступ к этому значению, вам нужно определить константу, определенную в Thierry Templier
ответ выше.