角度2/5组件相互作用

时间:2018-02-28 14:57:18

标签: angular

我有一个应该更改app.componant成员的警卫服务。 为此,我在app.componant创建了一个setter。这个setter应该由guard-service执行。我想通过输入和输出实现这一点。

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

@Injectable()
export class AppComponent {
  headerEnabled = true;
  @Output()
  changeHeaderEnable(b: boolean) {
      this.headerEnabled = b;
  }
}

如果该方法有效,我需要在我的AppComponant中使用方法changeHeaderEnable(),并将@Output()作为装饰器:

#include <iostream>

using namespace std;

template <typename T> struct Node{

    T value;
    Node * ptr;
};

template <typename T> class LinkedList {
public:

    LinkedList(const T & element);
    T & push(const T & element);
    T & pop(const int index);
    int get_size() const { return this->_size; }
    void printll();

private:
    LinkedList(){};
    struct Node<T> * head;
    int _size;
};

template <typename T> LinkedList<T>::LinkedList(const T & element){

    struct Node<T> new_node;           
    new_node.value = element;
    new_node.ptr = nullptr;

    this->head = &new_node;            

    this->_size = 1;                    
}

template <typename T> void LinkedList<T>::printll(){

    if(this->head != nullptr){

        Node<T> * temp = this->head;
        while((*temp).ptr != nullptr){  // Error here.
            cout << (*temp).value << " ";
            temp = temp->ptr;
        }
        cout << (*temp).value << endl;
        cout << endl;

    }else {
        cout << "The list is empty!" << endl;
    }
}

int main(int argc, char** argv){

    LinkedList<int> l1(5);

    l1.printll();

    return 0;
}

我将两个组件都缩减为重要内容。 现在我希望每次我链接到一个不同的路由,其中​​AuthGuardService作为一个后卫,canActivate()应该执行。但每当我链接到另一台路由器时,我都会收到以下错误:

  

错误错误:未捕获(在承诺中):TypeError:无法读取属性&#39; changeHeaderEnable&#39;未定义的

为什么在我的警卫服务中未定义changeHeaderEnable?我错了什么?

1 个答案:

答案 0 :(得分:1)

装饰器@Input和@Output用于父组件和子组件之间的属性绑定。您不能像在服务中那样在服务中使用它们。它们依赖于变化检测,这仅适用于组件和指令。

老实说,提供的代码存在很多问题。我看到你还用@Injectable而不是@Component装饰你的app.component,这是另一个大问题。默认情况下,所有组件(和指令)都是可注入的。

如果您还没有完成Angular教程,我建议您完成: Angular Tutorial