【问题标题】:Class method not working Angular 2 Typescript类方法不起作用Angular 2 Typescript
【发布时间】:2016-02-22 21:38:59
【问题描述】:

我有一个<navbar> 组件,它有一个方法makeSelected,顾名思义,它可以选择一个项目。单击该项目时效果很好,但是在我的主页上,我希望无需单击即可选择它。

我已将 Navbar 组件注入到 Home 组件中,并在 Home 构造函数中调用 makeSelected 方法:

import {Component, View} from 'angular2/core';
import {Navbar} from '/app/navbar/navbar';

@Component({
  selector: 'home',
  providers: [Navbar]
})

@View({
  templateUrl: '/app/home/home.html',
  directives: [Navbar]
})

export class Home {

    constructor(public navbar : Navbar) {

      this.navbar = navbar;
      this.navbar.makeSelected('Item 1');

    }

}

导航栏组件:

import {Component, View} from 'angular2/core';

@Component({
  selector: 'navbar'
})

@View({
  template: `
  <ul>
    <li *ngFor="#item of items; #i = index" (click)="makeSelected(item.name)">

      {{ item.name }} <div *ngIf=" item.selected == true"> [selected] </div>

    </li>
  </ul>
  `
})

export class Navbar{
  constructor(){
      this.items = [
        {id: 1, name: 'Item 1', href: 'http://www.google.com', selected: false}
      ]
  }
  makeSelected(name)
  {
    for(var i in this.items)
    {
      this.items[i].selected = false;

      if(this.items[i].name == name)
      {
        this.items[i].selected = true;
      }
    }
  }
}

页面显示正常,但未选择该项目。没有错误,所以该方法似乎被调用了。

为什么没有选择项目?

【问题讨论】:

  • 会不会是构造函数中注入的navbar是不同的实例?

标签: typescript angular


【解决方案1】:

你不能像这样将子组件注入到父组件中。您应该使用@ViewChild@Query 引用此组件:

export class Home {
  constructor(@Query(Navbar) children:QueryList<Navbar>) {
    this.navbar = children.first();
    this.navbar.makeSelected('Item 1');
  }
}

小心从组件的providers 属性中删除NavBar。仅将其保存在 directives 属性中。

查看这个问题了解更多详情:

【讨论】:

  • Component 正在访问 Child 组件?是不是很酷?
  • @PankajParkar,是的,没关系。这是另一个应该很少见的方向:请参阅 Miško 对此线程的第一条评论:github.com/angular/angular/issues/3216related question
  • 谢谢!我已经设法用@ViewChild angular.io/docs/js/latest/api/core/ViewChild-var.html 做到了
  • 感谢 Pankaj 和 Mark 的 cmets!
  • @PankajParkar,是的,Navbar 组件和关联的 NavbarService 听起来是一个不错的解决方案。这是an answer 我昨晚刚写了一个 NavService ,它有一个可以适用于这里的 Observable。
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 2016-09-11
  • 2017-10-07
  • 2016-12-18
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多