从子@Input setter - Ionic2 / Angular2访问提供者方法

时间:2016-08-17 01:33:28

标签: angular typescript ionic2

我正在尝试从我的组件@Input方法访问提供程序类。但是,在调用@Input方法时,似乎提供程序不可用

以下是我的代码

#provider
import { Injectable } from '@angular/core';
import 'rxjs/add/operator/map';


@Injectable()
export class MyProvider {

  constructor() {}

  sampleMethod(){
    return 'sample method';
  }
}

#component
import { Component, Input } from '@angular/core';
import {MyProvider} from '../../providers/my-provider/my-provider';
import { NavController} from 'ionic-angular';

@Component({
  selector: 'selected-options',
  templateUrl: 'build/components/selected-options/selected-options.html',
  inputs: ['node']
})
export class SelectedOptions {

  provider: MyProvider;

  @Input()
  set node(n: any){
     this.provider.sampleMethod();    
  }
}

#page (where I call the component) 
<selected-options [node]="node.Name"></selected-options>

所以问题在于

this.provider.sampleMethod();

我得到的错误是ORIGINAL EXCEPTION: TypeError: Cannot read property 'sampleMethod' of undefined

因此,我认为调用provider: MyProvider;方法时未加载@Input。但是如果我在构造函数中使用它,这可以正常工作。 如何在@Input方法中访问提供者方法?

2 个答案:

答案 0 :(得分:1)

要访问您的提供商,您必须告诉应用程序。关于应用程序中的ionic2,当你引导应用程序时,添加你的提供商

import {YourProviderWithInjectableDecorator} from 'somepath';

    ionicBootstrap(MyApp, [YourProviderWithInjectableDecorator])
你班上的

Component({
  selector: 'selected-options',
  templateUrl: 'build/components/selected-options/selected-options.html',
  inputs: ['node']
})
export class SelectedOptions {

  constructor(private provider: MyProvider){}

  @Input()
  set node(n: any){
     this.provider.sampleMethod();    
  }
}

希望有所帮助

答案 1 :(得分:1)

这可能听起来很混乱,但是你得到的错误是因为提供程序没有作为参数包含在构造函数中(因此,你的构造函数没有创建MyProvider类的实例)。

请查看this plunker。就像你可以在那里一样,即使我们在myProvider setter拦截器中使用@Input实例,构造函数已经创建了服务的实例,因此你可以毫无问题地调用sampleMethod()

import { Component, Input } from "@angular/core";
import { MyProvider } from './my-provider.ts';

@Component({
  templateUrl:"child.html",
  selector: 'child-selector',
  inputs: ['node']
})
export class ChildPage {

  private result: string;

  @Input()
  set node(node: string){
    // Because the provider instance is injected on the constructor, we can
    // call the sampleMethod() here
    node = node + ' from ChildPage';
    this.result = this.myProvider.sampleMethod(node);
  }

  // Injects an instance of the MyProvider class
  constructor(private myProvider: MyProvider) {

  }
}

因此,如果您只是在构造函数中添加private myProvider: MyProvider参数,那么您的代码应该可以正常工作:)