2016-03-15 69 views
0

我正在閱讀很多關於此問題的文章,如this,and thisalso this,但這些文章中的每一篇都從NG1服務爲class並且可以導出的情況開始。在angular2指令中注入angular1服務

我在一個非常不同的情況的時候,我經常在同一個文件中的多個服務,他們在一個非常古老的風格方式像

angular.module('App.services').factory('SessionService', 
    function() { 
     var defer = $q.defer(); 
     [...] 
    } 
); 

沒有class,沒有export定義。

而且這東西在頁面直接鏈接與老式<script src="...">

同時我想要創造Angular2和這些指令的新指令需要那些老式的服務。

我得到我應該能夠寫出這樣的事情

import {Injector,Component, Directive, ElementRef, Input, View} from 'angular2/core'; 

var injector = Injector.resolveAndCreate([ 
    SessionService 
]); 

var SessionService = injector.get(SessionService); 


@Component({ 
    selector: 'nav-bar' 
}) 

@View({ 
    templateUrl: '/app/components/navbar/navBar.html' 
}) 

export class navBar { 
    constructor() { 

    } 
} 

但當然SessionService對象沒有被發現。

我怎樣才能擺脫這個混亂?

[附加信息]

使用babel作爲transpiler

angular2-annotations插件加入

一個偉大的文章,瞭解angular2註解和裝飾之間的區別:http://blog.thoughtram.io/angular/2015/05/03/the-difference-between-annotations-and-decorators.html

+0

而不是試圖導入腳本和手動注入,嘗試包括所有的腳本,你index.html中序列。 然後你可以通過它的名字直接導入你的控制器裏面的服務.... – damitj07

回答

1

你只需要槓桿@Inject

@Component({ 
    selector: 'nav-bar' 
    templateUrl: '/app/components/navbar/navBar.html' 
}) 
export class navBar { 
    constructor(private @Inject('SessionService') sessionService) { 

    } 
} 

有關詳細信息,請參閱本plunkr:http://plnkr.co/edit/U6ygjUUQ04mTGAAaC1pZ?p=preview

你可以注意到,與工廠不能使用類。這是唯一與服務成爲可能......

如果使用ES6而已,你可以試試這個:

@Component({ 
    selector: 'nav-bar' 
    templateUrl: '/app/components/navbar/navBar.html' 
}) 
export class navBar { 
    constructor(sessionService) { 

    } 

    static get parameters() { 
    return [[ new Inject('...'), new Inject('...') ]]; 
    } 
} 
+0

我試圖使用@inject,但是我得到了'意外的令牌'。是的,我從角度/核心導入注入。像@ Component這樣的符號可以正常工作......(使用babel) – Bolza

+0

您是否使用'UpgradeAdapter'類的'bootstrap'方法引導您的應用程序?看我的朋友。否則相應的供應商將不會在那裏... –

+0

當然是。我可以告訴你@Inject for transpiler只有當它是一行中的第一個語句時纔有效...不知道爲什麼,但基本上我不能在構造函數中使用它或將其分配給變量... – Bolza