2017-07-17 41 views
8

我有一个类(接口)在我的角4应用程序,它有很多领域。 请注意,此类/接口的实例是immutable(即成员永远不会被更改)。对于有很多字段的类/接口,性能会有什么影响?

E.g.

public interface IHaveALotOfFields { 
    field1: string; 
    //... 
    field500: string; 
} 

此接口是通过提供一个(单件/应用程序级别提供的)服务提供的,该服务将类作为成员公开。例如。

@Injectable() 
public class MyService { 
    public translations: ITranslationsProvider; 
} 

该服务在ts -part组件的注入大量在其相应的模板中使用的部件(几乎所有组件)和经常的和经常也。例如。

@Component({ 
       template: `Value: {{service.field500}}` 
      }) 
export class MyComponent { 
    public constructor(public service: MyService) { 
    } 

    private doSomething(): string { 
     return this.service.field1; 
    } 
} 

现在我的问题:

  • 将一个大的类(很多领域)做出,因为变化的检测角慢?
  • 有没有办法将班级标记为“忽略变更检测”? (类似的东西来ChangeDetectionStrategy.OnPush,但不是指定此为每个组件,可以在类本身或服务的成员上进行声明)

请注意,我不想改变变化检测所有我的组件的战略OnPush

+0

的接口只是一种类型检查的方法。它不会被注入...只有被注入的对象被一个类的新实例化。界面是这个班将遵守的合同。在界面中为合同分配属性和方法签名......服务具有@Injectable和Angular负责为您自动实例化这些东西,并自动将事物连接在一起。 – JGFMK

+0

我知道。我有实现这个接口的具体类。 MyService基本上获得了实现注入接口的类的实例。 –

+0

界面不是只注入对象..这是我希望能帮助你的。即您无法在界面上进行新操作... – JGFMK

回答

4

由于 变化检测,一个大类(有很多字段)会使角度变慢吗?

号角变化检测执行该读类属性两个操作:当前组分中的子组件

  • 输入绑定更新上

    • DOM更新/指令

    对于这些操作角编译器创建两个函数:

    • updateRenderer - 读取在模板
    • updateDirectives使用的字段 - 读取在输入绑定表达式

    这些功能读取来自服务只有特定的属性中指定的字段。对于示例

    Value: {{service.field500}}

    updateRenderer功能看起来沿线:

    function(_ck,_v) { 
        var _co = _v.component; 
        var currVal_0 = _co.service.field500; 
        _ck(_v,1,0,currVal_0); 
    

    这些函数被称为每个消化循环。但正如你所看到的,只有相关的财产将从服务中读取。因此,服务上有多少物业并不重要。

    有没有办法将班级标记为“忽略变更检测”?

    我假设你问我们在AngularJS中的一次性绑定。也许它会被添加到Angular中。如果出现问题,我会监控并更新答案。但正如您可能知道的那样,您可以使用cd.detach/cd.attach禁用/启用组件的变更检测。您可以在服务中监听某些信号,并在需要时手动运行CD。

    下面是文章列表,你可以看的懂变化检测的机制更好:

  • +0

    感谢您的出色答案。我认为将类标记为“忽略变化检测”的方式是,如果有方法可以告诉角,则此特定类的属性/字段是“常量”(具有常数值)并且永远不会更改。无论班级是从服务中注入还是作为输入或其他方式注入。 –

    +0

    @OschtärEi,啊,我明白了。不,不幸的是,还没有办法做到这一点。在AngularJS中,我们有一次性绑定。也许它会被添加到Angular中。如果出现问题,我会监控并更新答案。但正如您可能知道的那样,您可以使用'cd.detach/cd.attach'来禁用/启用组件的变更检测。您可以在服务中监听某些信号,并在需要时手动运行CD。 –

    +0

    再次感谢。但是,如果我使用'detach/attach',则组件的所有变化检测将被分离(我不想要的),并且我需要在所有组件中执行此操作(因为几乎所有组件都使用此“大类” (这是翻译) –

    相关问题