关于Angular Component changeDetection策略设置成OnPush的一个单元测试局限性

简介: 关于Angular Component changeDetection策略设置成OnPush的一个单元测试局限性

image.pngimage.pngimage.png

OnPush: 0

Use the CheckOnce strategy, meaning that automatic change detection is deactivated until reactivated by setting the strategy to Default (CheckAlways). Change detection can still be explicitly invoked. This strategy applies to all child directives and cannot be overridden.


注意:仍然可以显式触发。


Default: 1

Use the default CheckAlways strategy, in which change detection is automatic until explicitly deactivated.


我们甚至可以更改某个Component的change detection频率。


Detach change detector to limit how often check occurs

The following example defines a component with a large list of read-only data that is expected to change constantly, many times per second. To improve performance, we want to check and update the list less often than the changes actually occur. To do that, we detach the component’s change detector and perform an explicit local check every five seconds.


class DataListProvider {

 // in a real application the returned data will be different every time

 get data() {

   return [1, 2, 3, 4, 5];

 }

}


@Component({

 selector: 'giant-list',

 template: `

   

  • Data {{d}}
  •    `,

    })

    class GiantList {

     constructor(private ref: ChangeDetectorRef, public dataProvider: DataListProvider) {

       ref.detach();

       setInterval(() => {

         this.ref.detectChanges();

       }, 5000);

     }

    }


    @Component({

     selector: 'app',

     providers: [DataListProvider],

     template: `

       

       `,

    })

    class App {

    }

    Angular应用 changeDetection模式的设置框架代码

    根据关键字ChangeDetectionStrategy搜索即可。


    const createInject = makeMetadataFactory('Inject', (token) => ({ token }));

    const createInjectionToken = makeMetadataFactory('InjectionToken', (desc) => ({ _desc: desc, ɵprov: undefined }));

    const createAttribute = makeMetadataFactory('Attribute', (attributeName) => ({ attributeName }));

    const createContentChildren = makeMetadataFactory('ContentChildren', (selector, data = {}) => (Object.assign({ selector, first: false, isViewQuery: false, descendants: false }, data)));

    const createContentChild = makeMetadataFactory('ContentChild', (selector, data = {}) => (Object.assign({ selector, first: true, isViewQuery: false, descendants: true }, data)));

    const createViewChildren = makeMetadataFactory('ViewChildren', (selector, data = {}) => (Object.assign({ selector, first: false, isViewQuery: true, descendants: true }, data)));

    const createViewChild = makeMetadataFactory('ViewChild', (selector, data) => (Object.assign({ selector, first: true, isViewQuery: true, descendants: true }, data)));

    const createDirective = makeMetadataFactory('Directive', (dir = {}) => dir);

    var ViewEncapsulation;

    (function (ViewEncapsulation) {

       ViewEncapsulation[ViewEncapsulation["Emulated"] = 0] = "Emulated";

       ViewEncapsulation[ViewEncapsulation["Native"] = 1] = "Native";

       ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";

       ViewEncapsulation[ViewEncapsulation["ShadowDom"] = 3] = "ShadowDom";

    })(ViewEncapsulation || (ViewEncapsulation = {}));

    var ChangeDetectionStrategy;

    (function (ChangeDetectionStrategy) {

       ChangeDetectionStrategy[ChangeDetectionStrategy["OnPush"] = 0] = "OnPush";

       ChangeDetectionStrategy[ChangeDetectionStrategy["Default"] = 1] = "Default";

    })(ChangeDetectionStrategy || (ChangeDetectionStrategy = {}));

    const createComponent = makeMetadataFactory('Component', (c = {}) => (Object.assign({ changeDetection: ChangeDetectionStrategy.Default }, c)));

    const createPipe = makeMetadataFactory('Pipe', (p) => (Object.assign({ pure: true }, p)));

    const createInput = makeMetadataFactory('Input', (bindingPropertyName) => ({ bindingPropertyName }));

    const createOutput = makeMetadataFactory('Output', (bindingPropertyName) => ({ bindingPropertyName }));

    const createHostBinding = makeMetadataFactory('HostBinding', (hostPropertyName) => ({ hostPropertyName }));

    const createHostListener = makeMetadataFactory('HostListener', (eventName, args) => ({ eventName, args }));

    const createNgModule = makeMetadataFactory('NgModule', (ngModule) => ngModule);

    const createInjectable = makeMetadataFactory('Injectable', (injectable = {}) => injectable);


    //告诉Angular,你正在使用自定义元素

    const CUSTOM_ELEMENTS_SCHEMA = {

       name: 'custom-elements'

    };

    ```![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20210213110729716.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2kwNDI0MTY=,size_16,color_FFFFFF,t_70)


    目录
    相关文章
    |
    3月前
    |
    Web App开发 UED 开发者
    谈谈企业级 Angular 应用的二次开发 - 基于 Angular Component 替换的 Extensibility 支持案例介绍
    谈谈企业级 Angular 应用的二次开发 - 基于 Angular Component 替换的 Extensibility 支持案例介绍
    38 1
    |
    6月前
    |
    JavaScript 数据安全/隐私保护 开发者
    Angular Component Class 成员属性默认的访问权限控制
    Angular Component Class 成员属性默认的访问权限控制
    65 0
    |
    3月前
    |
    JavaScript
    Angular Component 内 set 关键字的使用
    Angular Component 内 set 关键字的使用
    24 0
    |
    4月前
    Angular多个页面引入同一个组件报错The Component ‘MyComponentComponent‘ is declared by more than one NgModule怎么办?
    Angular多个页面引入同一个组件报错The Component ‘MyComponentComponent‘ is declared by more than one NgModule怎么办?
    |
    5月前
    |
    前端开发 JavaScript 测试技术
    什么是 Angular 的 Custom component
    什么是 Angular 的 Custom component
    30 1
    |
    6月前
    |
    测试技术 API 开发者
    关于 Angular Component ChangeDetectionStrategy.OnPush 策略
    关于 Angular Component ChangeDetectionStrategy.OnPush 策略
    37 0
    |
    6月前
    |
    前端开发 测试技术
    关于 fakeAsync 在 Angular 应用单元测试开发领域的使用介绍
    关于 fakeAsync 在 Angular 应用单元测试开发领域的使用介绍
    38 0
    |
    6月前
    |
    测试技术 开发者
    关于 Angular testing 开发包里 fakeAsync 测试工具的用法
    关于 Angular testing 开发包里 fakeAsync 测试工具的用法
    19 0
    |
    14天前
    |
    测试技术 C语言
    网站压力测试工具Siege图文详解
    网站压力测试工具Siege图文详解
    21 0
    |
    1月前
    |
    JavaScript jenkins 测试技术
    这10款性能测试工具,收藏起来,测试人的工具箱!
    这10款性能测试工具,收藏起来,测试人的工具箱!