2016-06-06 8 views
11

ich eine globale Variable js unten definiert haben (@Url ist eine HTML-Helfer ASP.Net MVC in einen String-Wert konvertiert wird erhalten):Wie global js Variable in angular2 Komponente zuzugreifen

<script> 
    var rootVar = '@Url.Action("Index","Home",new { Area = ""}, null)'; 
    System.import('app').catch(function(err){ console.error(err); }); 
</script> 

Wie Ich greife auf rootVar in einer angular2-Komponente zu? Ich habe den Fensterservice in Winkel 1.5 benutzt, gibt es eine analoge Vorgehensweise in angular2?

Insbesondere möchte ich, dass rootVar Variable verwenden, um die templateUrl in dieser Komponente zu helfen zu erzeugen:

import { Component, Inject} from '@angular/core'; 

@Component({ 
    selector: 'home-comp', 
    templateUrl: '../Home/Root' 
}) 

export class HomeComponent { 
    constructor() { } 
} 
+1

Wenn es global ist, ist es global. Das bedeutet, dass jeder JS-Code auf die Variable zugreifen kann. –

+1

Sie können diese Antwort Thierry http://stackoverflow.com/questions/37337185/passing-asp-net-server-parameters-to-angular-2-app/37384405#37384405 – yurzui

Antwort

7

Sie müssen die Datei aktualisieren, die Ihre Anwendung Schopf aus dem Sumpf, eine Funktion zu exportieren:

import {bootstrap} from '...'; 
import {provide} from '...'; 
import {AppComponent} from '...'; 

export function main(rootVar) { 
    bootstrap(AppComponent, [ 
    provide('rootVar', { useValue: rootVar }) 
    ]); 
} 

Jetzt können Sie die Variable aus der index.html Datei auf diese Weise bereitstellen:

<script> 
    var rootVar = '@Url.Action("Index","Home",new { Area = ""}, null)'; 
    System.import('app/main').then((module) => { 
    module.main(rootVar); 
    }); 
</script> 

Dann können Sie die rootVar in Komponenten und Dienste auf diese Weise injizieren:

import { Component, Inject} from '@angular/core'; 

@Component({ 
    selector: 'home-comp', 
    templateUrl: '../Home/Root' 
}) 
export class HomeComponent { 
    constructor(@Inject('rootVar') rootVar:string) { } 
} 
+0

Danke, ich konnte Greife auf die Variable in meiner Komponente zu, die deinem Beispiel folgt, aber ich stoße auf ein neues Problem. Jetzt, da ich die Wurzelvariable in den Konstruktor eingefügt habe, kann ich sie nicht benutzen, um die Komponente templateUrl zu modifizieren. @ Komponente ({ selector: 'home-comp', templateUrl: '..{{baseUrl}} Home/Root ' }) Export-Klasse HomeComponent { baseUrl: string; Konstruktor (@Inject ('rootVar') rootVar: Zeichenfolge) { this.baseUrl = rootVar; } } – cobolstinks

+0

Gern geschehen! Tatsächlich können Sie die Variable nicht auf diese Weise verwenden, um den tempatteUrl-Pfad zu erstellen. Einer ist auf der Ebene der Klasse und andere der Instanz ... In Ihrem Fall würde ich versuchen, die UrlResolver-Klasse zu erweitern und injizieren Sie Ihre Variable darin. Siehe diesen Link: https://angular.io/docs/ts/latest/api/compiler/UrlResolver-class.html. –

3

Ein anderer Ansatz wäre Ihre var zu exportieren, für die Ex:

export var API_ENDPOINT = '@Url.Action("Index","Home",new { Area = ""}, null)'; 

und importieren Sie dann, dass in Ihrer Komponente

import {API_ENDPOINT } 
16

Innerhalb Ihrer Komponente können Sie Fenster verweisen auf die globalen Variablen zugreifen wie so:

rootVar = window["rootVar"]; 

oder

let rootVar = window["rootVar"]; 
4

in der Komponentendatei Definition außerhalb Komponentenklasse, erklärt rootVar, und es wird in der Komponente Konstruktor zur Verfügung steht:

declare var rootVar: any; 

dann

@Component(...) 
export class MyComponent { 
    private a: any; 

    constructor() { 
    this.a = rootVar; 
    } 
} 
+1

Wichtig zu beachten. Ich konnte die Deklaration außerhalb der Komponentenklasse nicht für alle Methoden in der Komponentenklasse sichtbar machen. Sie müssen eine Instanzvariable im Konstruktor festlegen, um auf die globale Variable zu verweisen, und dann auf diese Variable in Ihren Methoden verweisen – hewstone

0

Hier vergessen Sie nicht, Ihre Hände zu waschen ... Angular ist nur und Javas cript

//Get something from global 
let someStuffFromWindow= (<any>window).somethingOnWindow; 

//Set something 
(<any>window).somethingOnWindow="Stuff From Angular"; 

Das ist schlecht aus irgendeinem Grund .. Sie sollten sich schlecht fühlen!