2

我想我們基於MVC的網站的前端分離成幾個組成部分,我想使用角度爲目的(如創建購物車的應用程序,我可以包括我的看法之後)。外部值傳遞給一個角度應用

問題是,我需要幾個變量傳遞到該應用程序,我不知道該怎麼做安全,專業。我在想是這樣的:

  1. 我要ng build --prod --aot
  2. 我注入我的所有腳本我的看法
  3. 我注入傳遞給瀏覽到我的應用程序

變量.. 。和 「代碼」 爲我的想法表示:

控制器:

public function viewAction() 
{ 
    $this->view->addCss('angular/app/styles.css'); // adds styles for cart app 
    $this->view->addJS('angular/app/scripts.js'); // adds scripts for cart app 
    $this->view->setJSVariable('idCustomer', 555); // sets global var idCustomer 
} 

查看:

<!-- bunch of HTML for view ... --> 
<script> 
    // CartApp would be an angular app. 
    CartApp.use([ 
     idCustomer 
    ]); 
</script> 

所以我的問題是...這將是可能的(這將是一個很好的解決方案),以獲得CartApp作爲一個對象,然後進行一些功能(如use在上面的例子中),將設置/傳遞數據? (比方說一些全球提供的服務/組件或其他任何東西)。或者有沒有其他方法可以做到這一點?就像從窗口對象的應用程序內部獲取變量一樣? (因爲無論如何他們將被綁定到窗口)。謝謝。

回答

1

所以我打算利用輸入綁定建議......我沒有做過在AngularJS卻驚奇地發現,根組件使用的輸入綁定還不支持。你可以愉快的閱讀這個巨大的問題:

所以2個好的選擇是:

  1. 添加普通的HTML屬性的根組件:

    <app-root appData='important stuff'></app-root> 
    

    ,並使用ElementRef來接他們:

    @Component({ 
        selector: 'app-root' 
    }) 
    export class AppComponent { 
        constructor(el: ElementRef) { 
        console.log(el.nativeElement.getAttribute('appData')); 
        } 
    } 
    

    如果你只是處理字符串或配置標誌,可能會工作得最好。如果您傳遞JSON,則需要手動解析它。

  2. 有服務器的JavaScript渲染的數據,並在您的應用程序導入:

    在服務器渲染這樣的事情是角之前加載自舉一個腳本標記或JS文件:

    window.APP_DATA = { ids: [1, 2, 3] } 
    

    import { BrowserModule } from '@angular/platform-browser'; 
    import { NgModule } from '@angular/core'; 
    
    import { AppComponent } from './app.component'; 
    
    @NgModule({ 
        providers: [{ provide: 'AppData', useValue: (<any> window).APP_DATA }], 
        bootstrap: [AppComponent] 
    }) 
    export class AppModule { } 
    

    ,然後用它作爲一個正常的角度服務:

    使用供應商告訴你的NgModule吧

    import {Component, Inject} from '@angular/core'; 
    
    @Component({ 
        selector: 'app-root' 
    }) 
    export class AppComponent { 
        constructor(@Inject('AppData') appData) { 
        console.log(appData.ids); 
        } 
    } 
    
+0

這正是我所期待的。特別是第二種方式看起來相當不錯。非常感謝你@Scotty。 –

+0

我實際上有一些時間來看看它,但我無法像在第二個示例中那樣提供AppData。我遇到的錯誤是......'AppData'('provide'的vlaue沒有被指定(它應該首先被提供),第二個是該窗口沒有'APP_DATA'屬性(因爲它不是已知的您可以爲您的答案的第二個示例添加更多代碼示例嗎?不僅適用於我,也可能適用於其他具有相同問題的用戶。謝謝。 –

+0

我更新了代碼。測試它,但是已經從例子中編譯過了,對此我很抱歉,我沒有試圖獲得類型代碼,可以爲APP_DATA創建一個接口,將它導入到組件中,並在注入時使用它這個構造函數是:'constructor(@Inject('AppData')appData:MyAppDataInterface)'。讓我知道我的更新後的代碼是否適合你。主要的改變是在'provide:'字段中使用字符串,使用'(窗口) ',並使用'@Inject'。可能有更乾淨的方法來做到這一點,所以如果你找到了,請告訴我任何改進:) –