小编Cra*_*aig的帖子

如果不在异步测试执行区域内,fixture.whenStable() 实际上是否在我的角度测试中执行任何操作?

我最近阅读了很多关于角度测试的文章,这些对总是 async+fixture.whenStable 和 fakeAsync+tick,但是你总是可以调用 fixtrue.whenStable 因为它不是紧密耦合的。如果您在不使用 async 实用程序跟踪测试区域中的承诺时调用它,它实际上会做任何事情吗?

例如:

it('should be able to do this thing that needs some async setup', () => {
            fixture.detectChanges();
            fixture.whenStable().then()
});
Run Code Online (Sandbox Code Playgroud)

我明白之间的差别FakeAsync/Tickfixture.detectChanges。我的问题是关于fixture.whenstable当在FakeAsync执行区域内部时会做什么,因为Async区域应该跟踪异步工作,允许fixture.whenstable挂钩到该跟踪,至少在我的理解中是这样。或者实际上,如果使用并且根本不在异步执行区域内。

因此,如果在 FakeAsync 函数或未设置异步执行区域的函数中使用 fixture.whenstable,它会按预期工作吗?

unit-testing angular

22
推荐指数
2
解决办法
1万
查看次数

Redux Vs BehaviourSubject - 有什么区别?

假设您是Angular开发人员,您可能拥有一项名为User Service的服务.此服务具有您的组件订阅的行为主题(请参阅rxjs),并且假设该服务还具有一些方法来更改用户状态.

您的顶级组件侦听用户服务状态并将其输入到其子组件.然后,该子组件调用服务上的方法以更改用户状态,并且行为主体发出新值.现在,您的组件侦听获取更新的值并将其传递给其子级.

或者在另一个实现中,您在同一级别拥有一堆组件来监听状态更改.一个调用服务方法来改变状态并发出状态,所有组件监听都获得新状态.

在Redux方面,我很新,但我知道有一个州区.你的组件改为写入状态并从那里听取状态.

我没看到差异?我知道Redux还允许您查看实际调用哪些操作来更改状态,而在行为主题示例中,它们完全解耦,并且没有关于状态更改的原因或方式的概念 - 他们只知道状态现在是什么.

有人可以解决一些问题吗?

rxjs redux angular

10
推荐指数
4
解决办法
2307
查看次数

ngc 命令在 angular 应用程序中做什么?

我刚刚在教程中遇到了这个命令,我正在努力寻找有关 ngc 命令的任何信息。任何人都可以请说明一下吗?

ng build --prod && ngc

angular angular-cli-v6

6
推荐指数
1
解决办法
6386
查看次数

在更改支持垫树的数据后,为什么我的角度应用程序会变得非常慢?

我正在实现角度/材质树组件,并且遇到一些问题。保存对树的更改后,我正在重置支持树的数据(有效),但是应用程序变得异常缓慢,扩展节点可能需要8秒钟。

使这个问题变得更奇怪的是,实际上操纵数据源的代码是在其他地方运行的,例如向树中添加新的子级-我们希望更新UI,这不会引起问题。只有在保存时,应用程序才会变慢。

save(): void {
    const trees = this.flattenedTree.filter(node => this.isRootNode(node));

    this.serviceThatHasNoSideEffects.save(trees)
        .then(result => {
            this.tree = result;
            this.flattenedTree = this.getFlattenedTree();
            this.refreshTree();
        });
}

private refreshTree() {
    const data: any[] = this.flattenedTree
        .filter(x => this.isRootNode(x))
        .filter(x => x.children.length > 0 || x.id === this.focusId);

    this.nestedDataSource.data = null;
    this.nestedDataSource.data = data;

    const focusNode = this.getNode(this.focusId);
    this.nestedTreeControl.expand(focusNode);
}

private addChild(parentNode: any, childNode: any) {
    if (!this.getNode(parentNode)) {
        this.flattenedTree.push(parentNode);
    }

    if (!this.getNode(childNode)) {
        this.flattenedTree.push(childNode);
    }

    parentNode.children.push(childNode);

    this.refreshTree();
    this.nestedTreeControl.expand(parentNode);
}
Run Code Online (Sandbox Code Playgroud)

编辑:

更改刷新树以创建全新的数据源可解决缓慢的问题(内存泄漏?),但不会在UI中添加未显示的子对象。虽然孩子在展平的树上,但是应该显示出来。

private refreshTree() …
Run Code Online (Sandbox Code Playgroud)

angular-material angular

5
推荐指数
2
解决办法
2476
查看次数

Angular ngOnChanges 和变化检测策略似乎是矛盾的?

NgChanges on 在输入绑定上运行 - 如果输入是引用类型 - 当引用更改时。即像这样的对象:

{值:2}

如果其 value 属性更改,则不会导致 ngchanges 运行。这是因为 Angular 默认的更改检测策略会比较引用。

Angular2 更改检测:ngOnChanges 不会为嵌套对象触发

然而,当我们考虑两种变化检测策略时,这对我来说似乎是矛盾的:

默认 - 当绑定更改时,会发生组件的更改检测 - 但根据上面的说法,这不会识别引用类型的引用未更改的输入上的更改。或者换句话说,更改检测仅在值类型值更改或引用类型引用更改时运行。

OnPush - 更改检测仅在值类型值更改或引用更改时运行。

显然,默认的更改检测并不像我理解的那样工作,或者它与 OnPush 相同,但 onChanges 生命周期挂钩似乎只在与 OnPush 相同的规则下触发。

angular

5
推荐指数
1
解决办法
3137
查看次数

是否可以在不首先构建库的情况下将 NPM Link 用于角度库?

我有一个可以内置到节点模块中的角度库。

为了使用我的本地版本而不发布它,并测试它是否可以在多个应用程序上运行,我正在尝试使用该npm link命令。

我通过导航到我的库的 dist 文件夹(其中找到 package.json)并运行 npm link 来完成此操作。然后,我导航到我想要使用的应用程序并运行 npm link THE_LIBRARY_NAME。这工作正常,但如果我更新库,我将需要重建它,当我重建它时,链接会中断,所以我必须重复这些步骤。

如果我尝试链接到库本身,而不是它输出的节点模块,则会收到“找不到模块”错误。

请问我做错了什么?

尝试链接到库本身似乎确实有效,我可以在 node_modules 中找到它,但澄清一下导入并没有找到该模块。

angular

5
推荐指数
1
解决办法
2844
查看次数

角度测试async + whenStable和fakeAsync + tick有什么区别?

我知道asyncfakeAsync方法设置了某种监听器,该监听器记录了所有异步操作,以便角度测试框架可以使用whenStabletick()管理等待所有这些东西完成的过程。我认为那是正确的吗?

我努力理解的是,实际上执行顺序是否存在差异-因为如果没有,为什么要同时提供两者?

这使我学习了JS宏任务和Micro任务,我想知道这两种方法是否在此领域不同?

testing angular

4
推荐指数
1
解决办法
515
查看次数

将输入数据绑定到模板中的Angular组件时,使用括号而不是引号会怎样?

我刚刚遇到这个代码:

<pagination (selectRowChange)="changeSelectRow($event)"
                        [total]=(total)
                        [(currentPage)]="currentPage"
                        [(pageSize)]="pageSize"
                        [pageSizes]="pageSizes"
                        [start]=(start)
                        [end]=(end)
                        [dataFiltered]=(dataFiltered)
                        [maxPage]=(maxPage)
                        (goToPage)="goToPage($event)"
                        (searchSubmit)="search($event)"
                        [filteredTotal]=(filteredTotal)
                        [status]="isDataAvailable">
            </pagination>
Run Code Online (Sandbox Code Playgroud)

total和start输入采用括在括号中的值.我以前从未见过这个,我无法找到它的作用?

谢谢

angular angular5

3
推荐指数
1
解决办法
66
查看次数