angular 2 –通过组件更改全局服务中的接口,并在另一个组件中更新已更改的接口

用户2741109

我正在使用angular2。我想构建一个包含接口的全局服务。可以通过更改此界面HeaderComponent用户更改界面后,通过HeaderComponent该界面还可以在另一个界面中进行更改ChildComponent为此,我使用了在堆栈溢出时找到的答案

假设我有一个接口和2个不同的类。这些类中的每一个都拥有不同类型的接口。

我的界面

export interface MyInterface {
    key: string,
}

A类

import { MyInterface } from './interfaces/my-interface';
export class ClassA {
    type = "A";
    _interface: MyInterface = {
        key: "value1",
    };
}

B级

import { MyInterface } from './interfaces/my-interface';
export class ClassB {
    type = "B";
    _interface: MyInterface = {
        key: "value2",
    };
}

全局服务正在实现此接口。

全球服务

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

import { ClassA } from './classes/class-a';
import { ClassB } from './classes/class-b';
import { MyInterface } from './interfaces/my-interface';

@Injectable()
export class GlobalService {

    public interfaceChanged: EventEmitter<MyInterface>;
    _interface: MyInterface;

    interfaceList: string[] = [];

    interfaces = [
        new ClassA(),
        new ClassB()
    ];

    selectedInterface: string;

    constructor() {
        this.interfaceChanged = new EventEmitter<MyInterface>();
        for (var i = 0; i < this.interfaces.length; i++)
            this.interfaceList.push(this.interfaces[i].type);
        this.changeInterface(this.interfaceList[0]);
    }

    changeInterface(_interface: string): void {
        if (this.interfaceList.includes(_interface)) {
            this.selectedInterface = _interface;
            for (var i = 0; i < this.interfaces.length; i++) {
                if (this.interfaces[i].type == this.selectedInterface) {
                    this._interface = this.interfaces[i]._interface;
                    this.interfaceChanged.emit(this.interfaces[i]._interface);
                }
            }
        }
    }
}

现在HeaderComponent,将实施为指令app.component.ts

app.component.ts

import { HeaderDirective } from './directives/header';
import { FooterDirective } from './directives/footer';

@Component({
  selector: 'my-app',
  template: `
    <my-header></my-header>
    <div class="container">
      <router-outlet></router-outlet>
    </div>
    <my-footer></my-footer>
  `,
  styleUrls: [ ],
  directives: [HeaderDirective, FooterDirective, ROUTER_DIRECTIVES]
})
export class AppComponent { }

可以通过选择字段来更改界面:

import { Component } from '@angular/core';
import { MyInterface } from './interfaces/my-interface';
import { LanguageService } from './services/global-service';

@Component({
    selector: 'my-header',
    template: `
      <select (change)="change($event.target.value)">
        <option *ngFor=" let _interface of interfaceList ">{{ _interface }}</option>
      </select>
    `,
})
export class HeaderComponent {

    selectedInterface: string;
    interfaceList: string[];
    _interface: MyInterface;

    constructor(private globalService: GlobalService) {
        this.selectedInterface = this.globalService.selectedInterface;
        this.interfaceList = this.globalService.interfaceList;
        this._interface = this.globalService._interface;
    }

    change(_interface: string) {
        this.globalService.changeInterface(_interface);
    }
}

到目前为止,一切都很好。在通过我更改界面之后,我HeaderComponent希望在另一个界面中也要更改该界面,该界面ChildComponent将通过<router-outlet></router-outlet>

import { Component, EventEmitter } from '@angular/core';
import { GlobalService } from './services/global-service';
import { MyInterface } from './interfaces/my-interface';

@Component({
  selector: 'my-child',
  template: `
    <p>Test: {{ _interface.key }}</p>
  `,
})
export class ChildComponent {

    private _interface: MyInterface;

    constructor(private globalService: GlobalService) {

        this.globalService.interfaceChanged
                          .toPromise()
                          .then(_interface => {
                              this.changeLanguage(_interface);
                          })
                          .catch(err => {
                              console.log(err);
                          });
    }

    changeInterface(_interface: MyInterface) {
        this._interface = _interface;
    }
}

问题是通过可以更改接口,HeaderComponent但是对于,接口不会更改ChildComponentchangeInterface(interface: MyInterface)函数ChildComponent甚至都没有被调用。用户在这里使用:

...
constructor(globalService: GlobalService) {
    globalService.interfaceChanged.subscribe(_interface => this.changeInterface(_interface));
}
...

ChildComponent但是,如果这样做,我的sublime编辑器中就会出现错误:“参数'interface'隐式具有'any'类型。” 那我在做什么错?我在这里想念什么?

在这里,您可以在Plunker上看到它。

哈里·宁(Harry Ninh)

编辑器中的错误

“参数'接口'隐式具有'任何'类型。”

这是因为您具有严格的TypeScript规则,可防止tsc编译代码。通过转到tsconfig.json和关闭noImplicitAny标志来更改配置

"noImplicitAny": false

或在subscribe回调中将类型添加到您的界面中

globalService.interfaceChanged.subscribe((_interface: MyInterface) 
  => this.changeInterface(_interface));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何通过另一个组件在更新属性后触发一个组件在Angular 2中呈现?ngZone.run()无法正常工作

来自分类Dev

Angular 2在另一个组件上更改组件变量

来自分类Dev

如何从另一个组件调用一个组件中的方法是 angular2

来自分类Dev

如何动态地在另一个组件中显示一个组件 Angular2

来自分类Dev

Angular 2从组件到服务再返回到另一个组件共享数据

来自分类Dev

将字符串从angular2中的另一个组件tpl传递到组件

来自分类Dev

监视服务中的更改并更新angular2,打字稿中的组件

来自分类Dev

如何将对象从一个组件传递到另一个组件以在angular2中建立数据模型?

来自分类Dev

angular 2 - 在 div 单击时,将对象传递给另一个组件,另一个组件使用该对象调用休息服务

来自分类Dev

尝试在服务中创建一个 observable,在一个组件中使用它并在另一个组件 angular 4 中订阅它

来自分类Dev

使用Angular 2中另一个<input>组件的值来限制<input>的最大数量

来自分类Dev

另一个服务中的Angular2 Inject服务创建2个实例

来自分类Dev

Angular2将组件方法导入另一个组件

来自分类Dev

Angular2在另一个组件内部动态替换组件

来自分类Dev

来自另一个组件的Angular 2访问组件

来自分类Dev

Angular2在另一个组件内部动态替换组件

来自分类Dev

另一个组件内部的Angular2参考组件

来自分类Dev

Angular 2-无法在组件声明中导入另一个组件

来自分类Dev

将数据从一个组件传递到另一个 Angular 2

来自分类Dev

angular2:使用参数进行布线时,在另一个组件的模板中显示组件模板时出现问题

来自分类Dev

Angular 2-通过路由器链接将对象从一个组件发送到另一个组件

来自分类Dev

Angular 2 将变量从一个组件传递到另一个组件

来自分类Dev

Angular 2在2个几乎完全相同的组件中构成一个“通用”组件

来自分类Dev

组件属性更改的Angular 2更新视图

来自分类Dev

组件属性更改的Angular 2更新视图

来自分类Dev

从另一个组件完成http.get之后,Angular 2执行方法

来自分类Dev

Angular2如何使用Javascript XMLHttpRequest重定向到另一个组件?

来自分类Dev

路由到另一个组件时出现Angular 2错误

来自分类Dev

路由到另一个组件时出现Angular 2错误

Related 相关文章

  1. 1

    如何通过另一个组件在更新属性后触发一个组件在Angular 2中呈现?ngZone.run()无法正常工作

  2. 2

    Angular 2在另一个组件上更改组件变量

  3. 3

    如何从另一个组件调用一个组件中的方法是 angular2

  4. 4

    如何动态地在另一个组件中显示一个组件 Angular2

  5. 5

    Angular 2从组件到服务再返回到另一个组件共享数据

  6. 6

    将字符串从angular2中的另一个组件tpl传递到组件

  7. 7

    监视服务中的更改并更新angular2,打字稿中的组件

  8. 8

    如何将对象从一个组件传递到另一个组件以在angular2中建立数据模型?

  9. 9

    angular 2 - 在 div 单击时,将对象传递给另一个组件,另一个组件使用该对象调用休息服务

  10. 10

    尝试在服务中创建一个 observable,在一个组件中使用它并在另一个组件 angular 4 中订阅它

  11. 11

    使用Angular 2中另一个<input>组件的值来限制<input>的最大数量

  12. 12

    另一个服务中的Angular2 Inject服务创建2个实例

  13. 13

    Angular2将组件方法导入另一个组件

  14. 14

    Angular2在另一个组件内部动态替换组件

  15. 15

    来自另一个组件的Angular 2访问组件

  16. 16

    Angular2在另一个组件内部动态替换组件

  17. 17

    另一个组件内部的Angular2参考组件

  18. 18

    Angular 2-无法在组件声明中导入另一个组件

  19. 19

    将数据从一个组件传递到另一个 Angular 2

  20. 20

    angular2:使用参数进行布线时,在另一个组件的模板中显示组件模板时出现问题

  21. 21

    Angular 2-通过路由器链接将对象从一个组件发送到另一个组件

  22. 22

    Angular 2 将变量从一个组件传递到另一个组件

  23. 23

    Angular 2在2个几乎完全相同的组件中构成一个“通用”组件

  24. 24

    组件属性更改的Angular 2更新视图

  25. 25

    组件属性更改的Angular 2更新视图

  26. 26

    从另一个组件完成http.get之后,Angular 2执行方法

  27. 27

    Angular2如何使用Javascript XMLHttpRequest重定向到另一个组件?

  28. 28

    路由到另一个组件时出现Angular 2错误

  29. 29

    路由到另一个组件时出现Angular 2错误

热门标签

归档