Ionic 2 / Angular 2中的全局函数

时间:2017-04-02 03:19:12

标签: angular typescript ionic2 ionic3

如何设置可在所有视图中访问的全局功能?

在app.component.ts中我添加了一个简单的方法

  <button ion-button right (click)="openShare()">
  <ion-icon name="md-share"></ion-icon>
</button>

然后在我的导航中我有

self.context.openShare is not a function

当我尝试从任何页面访问此内容时,我得到以下内容。

grep -oP '\S+\s(?=Protectedfor(52weeks|365days))' file

如果我把它直接放在构造函数中(例如this.openShare();),它确实执行正常,但是当使用(点击)函数从任何页面调用它时它就不起作用了。

app.component.ts不是全局的吗?我认为这是我放置的地方,但也许我错过了一些东西。

基本上它是导航器上一个简单按钮的功能,我需要它是全局的,因为它在每个页面上使用。

任何帮助都会受到赞赏,仍然会将Ionic 2弄清楚。

3 个答案:

答案 0 :(得分:11)

您可以使用Directive

请尝试以下操作。

将以下代码放在单独的指令文件中。 (社会sharing.directive.ts);

import { Directive, HostListener } from '@angular/core';

@Directive({
  selector: '[socialSharing]'
})
export class SocialSharing {

  constructor() { }

  @HostListener('click') onClick() {
    // Your click functionality
  }
}

将其导入app.module.ts,然后添加到declarations

在HTML中,只需将attribute添加到指令文件中selector的任何元素。

<button ion-button right socialSharing>
 <ion-icon name="md-share"></ion-icon>
</button>

其他信息:

将值从组件传递到指令。

<强> home.html的

  <button ion-button right [socialSharing]="property">
    <ion-icon name="md-share"></ion-icon>
  </button>

<强> home.component.ts

 export class HomePage {

   property: string = 'some url';
    constructor() {}
 }

<强> 社交sharing.directive.ts

Input导入@angular/core以及其他人。

import { Directive, Input, HostListener } from '@angular/core';

@Directive({
   selector: '[socialSharing]'
})

export class SocialSharing {
  @Input('socialSharing') str: string;

  constructor() {}

  @HostListener('click') onClick() {
     console.log(this.str);
  }
};

  ngAfterInit() {
     console.log(this.str);
  };
}

在指令中使用元素:

<强> 社交sharing.directive.ts

ElementRef

导入@angular/core以及其他人
 import { Directive, ElementRef, HostListener } from '@angular/core';

 @Directive({
   selector: '[socialSharing]'
 })

 export class SocialSharing {

   // Add ElementRef to constructor

   constructor(el: ElementRef) {};

   ngOnInit() {
      let elRef = this.el.nativeElement;
      console.log(elRef.innerHTML);        
   };
 }

答案 1 :(得分:8)

您可以使用Providers轻松完成此操作。当您需要使用该功能(或提供商)时,您只需inject将其添加到您的相关组件中。就是这样。

方法1:

您可以使用CLI创建提供程序。

> ionic g provider YourProvider

你-provider.ts

 import { Injectable } from '@angular/core';

    @Injectable()
    export class YourProvider {

      constructor() {
      }

       openShare() {console.log("button clicked")} 
    }

app.module.ts

import { YourProvider } from "../pages/path";

    @NgModule({
      declarations: [
        MyApp,
      ],
      imports: [
        IonicModule.forRoot(MyApp),
       ],
      bootstrap: [IonicApp],
      entryComponents: [
        MyApp,
        ],
      providers: [{ provide: ErrorHandler, useClass: IonicErrorHandler },YourProvider  ]
    })

    export class AppModule { }

你-view.ts

       import { YourProvider } from '../../providers/your-provider';

        export class YourViewPage{

          constructor(public yourProvider : YourProvider) {

          }

        openShare(){
           this.yourProvider.openShare(); 
        }

方法2:创建abstract基类。

my-base-class.ts

export abstract class MyBaseClass {

  constructor() {
  }

  protected openShare():void {
    console.log("button clicked"); 
  }

}

MY-view.ts

export class MyViewPage extends MyBaseClass {
  constructor()
  {
     super();
  }

       openShare(){
               super.openShare(); 
            }
  }

答案 2 :(得分:3)

就像@Sampath所提到的,一种方法是使用自定义提供程序。但由于你的方法只是一个简单的方法,我认为你可以使用Events代替。它是这样的:

app.component.ts文件中,订阅新活动:

import { Events } from 'ionic-angular';

constructor(public events: Events, ...) {

  // ...

  events.subscribe('social:share', () => {

    // your code...
    console.log("button clicked");

  });

}

然后在任何其他页面中,只需发布​​事件以执行该逻辑:

function anotherPageMethod() {
  this.events.publish('social:share');
}