2016-01-26 63 views
2

嗨有人可以告訴我我做錯了什麼? 我認爲這是簡單的錯誤,但我是新來的角,我找不到它。沒有供應商字符串

例外:沒有String的提供者! (SwNavItemCmp - >字符串)

export interface SwNavItemModel { 
 
\t name: string; 
 
    route: string; 
 
    children?: Array<SwNavItemModel>; 
 
}

import {SwNavItemModel} from '../models/sw_nav_item_model'; 
 

 
export const NAV_ITEMS_DATA: Array<SwNavItemModel> = [ 
 
    { name: 'Home', 
 
    \t route: '/Home' }, 
 
    { name: 'Offer', 
 
    route: '/Offer', 
 
    \t children: [ 
 
     { name: 'Prices', 
 
     \t route: '/Prices' }, 
 
     { name: 'Samples', 
 
     route: '/Samples' } 
 
    ] 
 
    }, 
 
    { name: 'About', 
 
    route: '/About', 
 
    children: [ 
 
     { name: 'Us', 
 
     route: '/Us' }, 
 
     { name: 'Projects', 
 
     route: '/Projects' }, 
 
     { name: 'Skills', 
 
     route: '/Skills' } 
 
    ] 
 
    }, 
 
    { name: 'Contact', 
 
    route: '/Contact' } 
 
];

import {Injectable} from 'angular2/core'; 
 
import {NAV_ITEMS_DATA} from '../data/mock_nav_data'; 
 

 

 
@Injectable() 
 
export class NavService { 
 
\t getNavData() { 
 
\t \t return Promise.resolve(NAV_ITEMS_DATA); 
 
\t } 
 
}

import {Component, OnInit} from 'angular2/core'; 
 
import { 
 
ROUTER_DIRECTIVES 
 
} from 'angular2/router'; 
 
import {SwNavItemCmp} from './sw-nav-item/sw_nav_item'; 
 
import {SwNavItemModel} from '../../../models/sw_nav_item_model'; 
 
import {NavService} from '../../../services/nav_service'; 
 

 
@Component({ 
 
    selector: 'sw-nav', 
 
    templateUrl: './components/shared/sw-nav/sw_nav.html', 
 
    styleUrls: ['./components/shared/sw-nav/sw_nav.css'], 
 
    providers: [NavService], 
 
    directives: [ROUTER_DIRECTIVES, SwNavItemCmp] 
 
}) 
 
export class SwNavCmp implements OnInit { 
 
    public items: Array<SwNavItemCmp> = []; 
 

 
    constructor(private _navService: NavService) { 
 
    } 
 

 
    ngOnInit(): any { 
 
    this.getNavData(); 
 
    } 
 

 
    getNavData() { 
 
     this._navService.getNavData().then((navData: Array<SwNavItemModel>) => { 
 
      console.log(navData); 
 
      console.log(Object.keys(navData)); 
 
      this.addItems(navData); 
 
     }); 
 
    } 
 

 
    addItem(name: string, route: string, children?: Array<SwNavItemModel>) { 
 
    console.log(); 
 
    console.log('name: ' + name); 
 
    console.log('route: ' + route); 
 
    console.log('children: ' + children); 
 
    if(children) { 
 
     let childrenItems: Array<SwNavItemCmp> = []; 
 
     console.log('childrenItems: ' + childrenItems); 
 
     children.forEach((child) => { 
 
     console.log('child: ' + child); 
 
     childrenItems.push(new SwNavItemCmp(child.name, child.route, null)); 
 
     console.log('childrenItems: ' + childrenItems); 
 
     }); 
 
     this.items.push(new SwNavItemCmp(name, route, childrenItems)); 
 
     console.log('Items: ' + this.items); 
 
    } else { 
 
     this.items.push(new SwNavItemCmp(name, route, null)); 
 
     console.log('Items: ' + this.items); 
 
    } 
 
    } 
 

 
    addItems(itemsArray: Array<SwNavItemModel>) { 
 
    console.log('ItemsArray: ' + itemsArray); 
 
    itemsArray.forEach((item) => { 
 
     console.log('item: ' + item); 
 
     item.children ? this.addItem(item.name, item.route, item.children) : this.addItem(item.name, item.route, null); 
 
    }); 
 
    console.log('Items: ' + this.items); 
 
    } 
 
}

import {Component, Input} from 'angular2/core'; 
 
import {ROUTER_DIRECTIVES} from 'angular2/router'; 
 

 

 
@Component({ 
 
    selector: 'sw-nav-item', 
 
    templateUrl: './components/shared/sw-nav/sw-nav-item/sw_nav_item.html', 
 
    styleUrls: ['./components/shared/sw-nav/sw-nav-item/sw_nav_item.css'], 
 
    directives: [ROUTER_DIRECTIVES] 
 
}) 
 
export class SwNavItemCmp { 
 
\t @Input() items: Array<SwNavItemCmp>; 
 
    name: string; 
 
    route: string; 
 
    children: Array<SwNavItemCmp> = []; 
 
    constructor(name: string, route: string, children?: Array<SwNavItemCmp>) { 
 
    this.name = name; 
 
    this.route = route; 
 
    this.children = children; 
 
    } 
 
}

constructor(name: string, route: string, children?: Array) {... 

throw error TS2314: Generic type 'Array<T>' requires 1 type argument(s). 

/////////////////////////// ///////////////

現在我有這個:

個sw_nav.ts

... 
export class SwNavCmp implements OnInit { 
    public items: Array<SwNavItemCmp> = []; 
    ... 
} 

sw_nav.html

<nav> 
    <ul class="main-menu"> 
     <li *ngFor="#item of items"> 
      <sw-nav-item [items]="item.children"></sw-nav-item> 
     </li> 
    </ul> 
</nav> 

問題: -Should我通過整個項目insted的item.children的?

sw_nav_item.ts

import {Component, Input, Inject, Injectable} from 'angular2/core'; 
import {ROUTER_DIRECTIVES} from 'angular2/router'; 

@Component({ 
    selector: 'sw-nav-item', 
    templateUrl: './components/shared/sw-nav/sw-nav-item/sw_nav_item.html', 
    styleUrls: ['./components/shared/sw-nav/sw-nav-item/sw_nav_item.css'], 
    directives: [ROUTER_DIRECTIVES] 
}) 
@Injectable() 
export class SwNavItemCmp { 
    @Input() items: Array<SwNavItemCmp>; 

    name: string; 
    route: string; 
    children: Array<SwNavItemCmp>; 

    constructor(name, route, @Inject(SwNavItemCmp) children: Array<SwNavItemCmp>) { 
    this.name = name; 
    this.route = route; 
    this.children = children; 
    } 
} 

問題: - 如何應構造樣子?我認爲這是無效的。 - 如何將數據從輸入傳遞給構造函數? - 我應該使用Injector.resolveAndCreateChild()來輔助兒童物品嗎?

SW-NAV-item.html

???

問題: - 如何渲染它遞歸? 我想呈現所有sw-nav-item本身。

及主要問題: -where我應該把VAR注入= Injector.resolveAndCreate(... 提供(......),以及應該如何看起來像 - 如果我 有錯構或概念如何?做正確的方式嗎?我的意思是遞歸組件創建和重新編譯。

+0

我在SwNavItemCmp的構造函數中出錯,但我不明白是什麼和爲什麼。 – Sakala

回答

3

更新

- 如何應該構造樣子?我認爲這是無效的。

構造應該列出你想通過Angulars依賴注入(DI)獲得傳入的參數。 DI可以通過在那裏它有一個提供者登記在自舉(bootstrap(AppComponent, [SomeProvider, ...])

- 如何從輸入數據傳遞到構造器值? - 我應該使用Injector.resolveAndCreateChild()來分配兒童物品嗎?

我不知道你在這裏的意思是「輸入」或「兒童項目」。 你不需要Injector.resolveAndCreateChild()

- 如何呈現遞歸?我想渲染所有sw-nav-item本身。

我不明白這個問題。這與構造函數有什麼關係?

-where我應該把VAR注入= Injector.resolveAndCreate(...提供(...),

正如上面提到的,你不需要這個。

以及究竟應該如何樣子? - 如果我有錯的結構或概念,如何做是正確的方法是什麼?我的意思是遞歸的組件創建和rendreing。

你不東東d爲此的構造函數。 如果你想通過從父兒童的數據使用時綁定

<!-- in parent component --> 
<some-element [someInput]="someValueFromParent"> 

@Component({ 
    selector: 'child-component', 
}) 
export class ChildComponent { 
    @Input() someInput; 

    constructor() { 
    // here Angular hasn't yet assigned the `someValueFromParent` 
    } 

    ngOnInit() [ 
    // here or in event handlers I can access `someInput` and 
    // `someValueFromParent` is assigned 
    } 
} 

原始

nameroute參數沒有提供。

constructor(name: string, route: string, children?: Array<SwNavItemCmp>) { 

您不能在組件的構造函數參數瞞着DI如何在傳遞。

什麼是這些參數的目的是什麼?

+0

我想設置類型的名稱和路由參數作爲字符串和子SwNavItemCmp(自我,所以我不需要DI)。爲什麼我需要字符串提供者?無處不在的字符串全局類型?這個參數的目的是在構造函數中限制可接受的類型。 – Sakala

+0

我需要解釋爲什麼這些參數在那裏。這是什麼意圖?你爲什麼添加它們?只有Angulars依賴注入可以將參數值傳遞給組件。查看https://www.google.at/search?q=angular+2+dependency+injection下列出的文章以獲取介紹性信息。 –

+0

我曾經考慮過像C++這樣的構造函數,在這些構造函數中可以使用不同的參數。我認爲它在打字稿的角度上是相似的。我現在知道我錯了。這個想法是在SwNavCmp中創建SwNavItemCmp,然後將它們發送到SwNavItemCmp中的輸入並將它們分配給SwNavItemCmp的子項屬性。最後創建方法來動態添加新的SwNavItemCmp。我現在正在更改我的代碼,因此我很快發送了新的代碼片斷。 – Sakala