我最近阅读了很多关于角度测试的文章,这些对总是 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/Tick和fixture.detectChanges。我的问题是关于fixture.whenstable当在FakeAsync执行区域内部时会做什么,因为Async区域应该跟踪异步工作,允许fixture.whenstable挂钩到该跟踪,至少在我的理解中是这样。或者实际上,如果使用并且根本不在异步执行区域内。
因此,如果在 FakeAsync 函数或未设置异步执行区域的函数中使用 fixture.whenstable,它会按预期工作吗?
假设您是Angular开发人员,您可能拥有一项名为User Service的服务.此服务具有您的组件订阅的行为主题(请参阅rxjs),并且假设该服务还具有一些方法来更改用户状态.
您的顶级组件侦听用户服务状态并将其输入到其子组件.然后,该子组件调用服务上的方法以更改用户状态,并且行为主体发出新值.现在,您的组件侦听获取更新的值并将其传递给其子级.
或者在另一个实现中,您在同一级别拥有一堆组件来监听状态更改.一个调用服务方法来改变状态并发出状态,所有组件监听都获得新状态.
在Redux方面,我很新,但我知道有一个州区.你的组件改为写入状态并从那里听取状态.
我没看到差异?我知道Redux还允许您查看实际调用哪些操作来更改状态,而在行为主题示例中,它们完全解耦,并且没有关于状态更改的原因或方式的概念 - 他们只知道状态现在是什么.
有人可以解决一些问题吗?
我刚刚在教程中遇到了这个命令,我正在努力寻找有关 ngc 命令的任何信息。任何人都可以请说明一下吗?
ng build --prod && ngc
我正在实现角度/材质树组件,并且遇到一些问题。保存对树的更改后,我正在重置支持树的数据(有效),但是应用程序变得异常缓慢,扩展节点可能需要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) NgChanges on 在输入绑定上运行 - 如果输入是引用类型 - 当引用更改时。即像这样的对象:
{值:2}
如果其 value 属性更改,则不会导致 ngchanges 运行。这是因为 Angular 默认的更改检测策略会比较引用。
Angular2 更改检测:ngOnChanges 不会为嵌套对象触发
然而,当我们考虑两种变化检测策略时,这对我来说似乎是矛盾的:
默认 - 当绑定更改时,会发生组件的更改检测 - 但根据上面的说法,这不会识别引用类型的引用未更改的输入上的更改。或者换句话说,更改检测仅在值类型值更改或引用类型引用更改时运行。
OnPush - 更改检测仅在值类型值更改或引用更改时运行。
显然,默认的更改检测并不像我理解的那样工作,或者它与 OnPush 相同,但 onChanges 生命周期挂钩似乎只在与 OnPush 相同的规则下触发。
我有一个可以内置到节点模块中的角度库。
为了使用我的本地版本而不发布它,并测试它是否可以在多个应用程序上运行,我正在尝试使用该npm link命令。
我通过导航到我的库的 dist 文件夹(其中找到 package.json)并运行 npm link 来完成此操作。然后,我导航到我想要使用的应用程序并运行 npm link THE_LIBRARY_NAME。这工作正常,但如果我更新库,我将需要重建它,当我重建它时,链接会中断,所以我必须重复这些步骤。
如果我尝试链接到库本身,而不是它输出的节点模块,则会收到“找不到模块”错误。
请问我做错了什么?
尝试链接到库本身似乎确实有效,我可以在 node_modules 中找到它,但澄清一下导入并没有找到该模块。
我知道async和fakeAsync方法设置了某种监听器,该监听器记录了所有异步操作,以便角度测试框架可以使用whenStable并tick()管理等待所有这些东西完成的过程。我认为那是正确的吗?
我努力理解的是,实际上执行顺序是否存在差异-因为如果没有,为什么要同时提供两者?
这使我学习了JS宏任务和Micro任务,我想知道这两种方法是否在此领域不同?
我刚刚遇到这个代码:
<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输入采用括在括号中的值.我以前从未见过这个,我无法找到它的作用?
谢谢