【问题标题】:Access a provider method from child @Input setter - Ionic2 / Angular2从子 @Input 设置器访问提供程序方法 - Ionic2 / Angular2
【发布时间】:2016-08-17 01:33:27
【问题描述】:

我正在尝试从我的组件@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

所以我相信在调用@Input 方法时不会加载provider: MyProvider;。但是如果我在构造函数中使用它,这很好。 如何访问 @Input 方法中的提供程序方法?

【问题讨论】:

    标签: angular typescript ionic2


    【解决方案1】:

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

    请查看this plunker。就像你可以看到的那样,即使我们在@Input setter 拦截器中使用了myProvider 实例,构造函数已经创建了服务的实例,所以你可以毫无问题地调用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 参数,您的代码应该可以正常工作:)

    【讨论】:

    • 嘿@sebaferreras,再次感谢您的帮助以及对问题的详细解释,这解决了我的问题?
    • Np,这就是我们来这里的目的:)
    【解决方案2】:

    要访问您的提供商,您必须将它们告知应用程序。关于启动应用程序时 app.ts 上的 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();    
      }
    }
    

    希望对你有帮助

    【讨论】:

    • 嘿@Sudakatux,谢谢你的回答,是的,我已经有了它ionicBootstrap(MyApp, [MyProvider]);
    • @injectable 东西被注入到constructor() 尝试创建构造方法
    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 2017-09-25
    • 2017-09-06
    • 2013-03-14
    • 2018-12-10
    相关资源
    最近更新 更多