使用 ES6 测试 Angular 1.x 组件不会使用 $componentController 加载绑定

Posted

技术标签:

【中文标题】使用 ES6 测试 Angular 1.x 组件不会使用 $componentController 加载绑定【英文标题】:Testing Angular 1.x Component using ES6 doesn't load bindings using $componentController 【发布时间】:2017-10-31 03:59:19 【问题描述】:

我有以下代码

我的组件

class PaginationController
    page = 1

    constructor() 
        console.log(this) // PaginationController page: 1
    

export const PaginationComponent = 
  templateUrl: '/components/app/views/pagination.html',
  controller: PaginationController,
  controllerAs: '$ctrl',
  bindings: 
      data: '=',
      size: '<',
  

测试

import  PaginationComponent  from '../src/components/app/pagination'

describe("Pagination Controller", () => 

    let controller

    beforeEach(() => 
        angular
          .module("Test", [])
          .component('pagination', PaginationComponent)
    )

    beforeEach(window.module("Test"))

    beforeEach(inject(($componentController) => 
        controller = $componentController('pagination', null, 
            data: [],
            size: 10
        )
    ))

    it("change page", () => 
        console.log(controller)
    )
)

我希望控制器中的contructor 上的console.log 打印PaginationController page: 1, data: [], size: 10 但我得到PaginationController page: 1,所以我认为绑定不起作用。

谁能帮我理解为什么?

【问题讨论】:

【参考方案1】:

最后这项工作像这样明确地执行.contructor()

beforeEach(inject(($componentController) => 
    controller = $componentController('pagination', null, 
        data: [],
        size: 10
    )
    controller.constructor()
))

这里的问题是 .constructor 方法被调用了两次: 第一次是在$componentController 执行时,此时绑定在构造函数方法中不可用,但如果我执行controller.constructor(),则绑定可用。所以,我仍然不明白为什么。

【讨论】:

以上是关于使用 ES6 测试 Angular 1.x 组件不会使用 $componentController 加载绑定的主要内容,如果未能解决你的问题,请参考以下文章

使用 ES6 类作为 Angular 1.x 指令

如何使用 es6 模板文字作为 Angular 组件输入

译|什么时候应该使用 Angular 2

Jest React 测试 es6 导入/导出不需要的模拟

在 Angular 1.x 中通信组件或指令的有效方式

带有(ES6)类和继承的Angular.js DI