@在Angular中使用输入装饰器代替依赖项注入服务

@在Angular中使用输入装饰器代替依赖项注入服务,angular,dependency-injection,angular2-template,angularjs-decorator,Angular,Dependency Injection,Angular2 Template,Angularjs Decorator,据我所知,当存在来自数据库或具有常量值的类的持久数据时,我们应该使用依赖项注入,因为我们可以将服务作为要实例化的类的构造函数中的参数发送。该服务不需要实例化,也不需要作为参数传递,因为它知道从何处获取数据,并且将要使用的类将在实例化时调用它 但是,当信息不是持久的或常量时,我们应该在子组件中使用@input decorator,并使用父组件的html模板传递参数值 例如,假设我们有一个矩阵 @Component({ selector: 'app-matrix',

据我所知,当存在来自数据库或具有常量值的类的持久数据时,我们应该使用依赖项注入,因为我们可以将服务作为要实例化的类的构造函数中的参数发送。该服务不需要实例化,也不需要作为参数传递,因为它知道从何处获取数据,并且将要使用的类将在实例化时调用它

但是,当信息不是持久的或常量时,我们应该在子组件中使用@input decorator,并使用父组件的html模板传递参数值

例如,假设我们有一个矩阵

    @Component({
        selector: 'app-matrix',
      })
它有行、列和行

export class MatrizComponent implements OnInit {
  columnsQuantity:number;
  rowsQuantity:number;
}
假设这些行和列来自一个数据库或一个常量数据类,我们使用一个服务来获取该数据,这样我们就可以用一个获取服务的构造函数来扩展该类

export class MatrixComponent implements OnInit {
  columnsQuantity:number;
  rowsQuantity:number;
  constructor(private service:MatrixService) { 

  }
}
ngOnInit() {
    this.columnsQuantity = this.service.getColumnsQuantity();
    this.rowsQuantity = this.service.getRowsQuantity();
}
当我们需要实例化这个MatrixComponent时,我们只需编写

<app-matrix></app-matrix>
服务和依赖项注入是有意义的,因为有一种方法可以从可注入服务可以访问的数据库或常量值中获取持久数据

在上面的代码中,rowsQuantity和ColumnsQuantity是持久的或常量

但是,如果rowsQuantity和columnsQuantity不是持久的或常量的,那么这个可注入服务难道不可行吗?然后我们总是必须在MatrixComponent中使用@input decorator吗

在这种情况下,我们不必在构造函数中使用服务,而必须使用@input decorator,如下所示:

export class MatrixComponent implements OnInit {
      @input() columnsQuantity:number;
      @input() rowsQuantity:number;
      constructor() { 

      }
    }
    ngOnInit() {


    }
当我们需要实例化这个MatrixComponent时,我们必须传递参数

<app-matrix [columnsQuantity]="whateverColumnsValueHasBeenJustGottenAndIsNotPossibleToInject" [rowsQuantity] = "whateverRowssValueHasBeenJustGottenAndIsNotPossibleToInject"></app-matrix>


这是否总是正确的,或者我是否应该尝试使用依赖注入,即使使用非持久性或常量数据?在我应该这样做的情况下,我该怎么做呢?

如果rowsQuantity和columnsQuantity不是持久的或恒定的,但它们是持久的,那么这个可注入服务就不可能存在吗。不清楚您在问什么,因为代码没有反映问题。如果问题更像是我应该在父组件中获取service.getColumnsQuantity()值并通过输入将其传递给子组件,还是直接在子组件中获取它,那么答案是“始终取决于具体情况”。@estus。我真正想知道的是,如果它们不是持久不变的,会发生什么。您可能不需要代码;每次设置变量或对象值时,它在开始时不是持久的,有时它永远不会持久。这是基本的编程。在这种情况下,如果你说“它总是取决于情况”,我想举一个例子,在这个例子中,你可以表示一个可注入的服务,它从一个非持久性的、非常量的数据中获取它的值,如果有这样的东西的话。这完全取决于你如何使用你的服务。对数据库的请求应执行的频率和条件。是否应该缓存它们。显然,为了获取数据,应该在某个时候调用
service.getColumnsQuantity()
。考虑到您知道如何使用DI实现这一点,请提供一个示例,说明您如何使用DI而不使用@Input,然后回答问题。如果你不知道怎么做,我建议你从这个开始。如果rowsQuantity和columnsQuantity不是持久的或恒定的,但是它们是持久的,那么这个可注入服务就不可能存在吗。不清楚您在问什么,因为代码没有反映问题。如果问题更像是我应该在父组件中获取service.getColumnsQuantity()值并通过输入将其传递给子组件,还是直接在子组件中获取它,那么答案是“始终取决于具体情况”。@estus。我真正想知道的是,如果它们不是持久不变的,会发生什么。您可能不需要代码;每次设置变量或对象值时,它在开始时不是持久的,有时它永远不会持久。这是基本的编程。在这种情况下,如果你说“它总是取决于情况”,我想举一个例子,在这个例子中,你可以表示一个可注入的服务,它从一个非持久性的、非常量的数据中获取它的值,如果有这样的东西的话。这完全取决于你如何使用你的服务。对数据库的请求应执行的频率和条件。是否应该缓存它们。显然,为了获取数据,应该在某个时候调用
service.getColumnsQuantity()
。考虑到您知道如何使用DI实现这一点,请提供一个示例,说明您如何使用DI而不使用@Input,然后回答问题。如果你不知道怎么做,我建议你从这个开始。
<app-matrix [columnsQuantity]="whateverColumnsValueHasBeenJustGottenAndIsNotPossibleToInject" [rowsQuantity] = "whateverRowssValueHasBeenJustGottenAndIsNotPossibleToInject"></app-matrix>