问题标签 [angular2-changedetection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
385 浏览

angular - ng.core.ChangeDetectionStrategy.onPush 是如何工作的?

如果更改检测策略设置为 onPush,则如果组件属性发生更改,则仅应重新渲染组件。

这是一个示例代码:

这里即使属性不改变模板也被渲染?这是一个错误还是我误解了 onPush?

0 投票
2 回答
965 浏览

javascript - angular2中的`changeDetection:ChangeDetectionStrategy.OnPush`是否仅在一个方向上起作用:顶部->底部?

考虑一下这个笨蛋

这里是组件之间的关系

我们注意到Child1changeDetection: ChangeDetectionStrategy.OnPush

上面的代码很简单,parent发送一个对象child1,发送完全相同的对象到child11.

child11然后更新对象的原语。

我们看到parentandchild1的对象都被更新了,即使child1changeDetection: ChangeDetectionStrategy.OnPush

我猜changeDetection: ChangeDetectionStrategy.OnPush只有一种方式:从上到下。

真的吗?

如果是这样,这是有原因的吗?

0 投票
3 回答
4698 浏览

angular - Angular2:观察角度之外的外部变量

我希望能够在 angular2 之外的变量发生变化时进行观察和更新。所以假设我在一个外部 javascript 文件中有这个:

如何将此变量绑定到组件中的属性?

根据这个答案,显然这应该可以工作。
但事实并非如此。如果我在控制台中更改变量,该变量不会更新显示在模板中。我错过了什么吗?

0 投票
1 回答
634 浏览

angular - 聆听组件角度 2 中的模型

我正在使用 angular 2。我有一个场景,我有一个组件、接口和指令。

该指令用于自动建议,我的界面用作模型。

因此,每当用户选择一个值时,我都会更新模型,并且有一种方法可以让我的组件监听模型的变化。

指令-模型-组件交互

组件将如何监听我通过指令进行的模型更改?还可以使用模型来保存数据吗?

0 投票
2 回答
2457 浏览

angular - Angular2 ChangeDetection 还是 Observable?

我在使用登录时不刷新的组件时遇到问题。

该组件是 navbar.component ,其中包含指向我的页面/组件的链接。在它上面,有一个“登录”链接呈现 login.component,我可以在上面提供用户名和密码,然后单击登录按钮。login.component 使用 user.service,它使用 login.component 提供的用户名和密码调用后端,存储接收到的令牌并重定向到'/'。

此时,应该隐藏 navbar.component 上的“登录”链接并显示“注销”链接,但是在我单击导航栏上的其他链接之一之前什么都没有发生。

2个链接如下:

我了解存储令牌并从 user.service 重定向不会触发更改检测,并且我的属性 userService.isLoggedIn 不是可观察的,所以我知道我遗漏了一些东西,但不确定该方法是/应该是什么.

我尝试注入 ApplicationRef 来调用 tick() 方法,希望这会触发更改检测,但失败了。

我应该让我的财产 userService.isLoggedIn 成为可观察的吗?

0 投票
1 回答
977 浏览

angular - 自定义更改检测以执行深度对象比较而不是 Angular2 中的引用等于检查

我创建了一个过滤器管道来对一组对象执行过滤。该管道获取一个filterArgs对象,该对象包含一些属性,应根据这些属性过滤项目。

此外,我有一些输入字段,用户可以在其中设置过滤器参数。我直接绑定filterArgs对象的属性并为这样的项目应用过滤器:

在我的组件中,filterArgs对象定义如下(示意图):

所以现在的问题是,当输入字段之一发生更改时,过滤器不会被应用。据我了解 Angular 的变化检测,这是因为filterArgs对象的引用没有改变,因此 Angular 没有检测到任何变化。这是预期的行为和设计。

我现在的问题是:解决此问题的建议方法是什么?

幼稚的方法是在filterArgs每次输入字段更改时创建一个新对象,以便更新该对象的引用。在这种情况下,Angular 的变更检测就会发挥作用。但必须有更好的方法来做到这一点。我想我可以filterArgs用某种属性来注释属性,告诉 Angular 执行“深度对象比较”以检测更改。

0 投票
1 回答
429 浏览

angular - {{myArray}} 现在在 beta.16 的视图中更新

更改检测已更改。

在 beta.16 之前,如果您的视图包含{{myArray}},如果您不修改数组引用,则该绑定不会更新。例如,如果您将push()项目添加到数组中,则视图不会更新以显示新项目。解释是(嗯,是)因为数组引用没有改变,Angular 变化检测不会重新评估绑定。这个beta.15 plunker演示了这种行为。

从 beta.16(以及因此的 RC.1)开始,情况有所不同。{{myArray}}即使数组引用没有改变,绑定现在也会更新!请参阅此RC.1 plunker

我查看了beta.16 的 ChangeLog,我没有看到任何可以解释这种行为变化的东西(但也许我错过了一些东西)。有谁知道是什么导致了这种变化,还有什么可能会受到影响?

插件代码:

0 投票
1 回答
5572 浏览

angular - 防止本机浏览器事件(如滚动)触发更改检测

我正在绑定一个滚动事件来捕获滚动并对其进行处理,我创建了如下指令:

所以我有一个简单的指令,除了:

这工作正常,希望我可以看到它在我的所有应用程序中对滚动进行更改检测。

这是我的组件之一:

aFunction在某个组件的某个地方有一个模板:

以前,aFunction只有当我更新一些输入或单击按钮时才会被解雇,但现在,它会在滚动时检测到变化!!!所以我的滚动体验因此而滞后!

这是 Angular2 的正常行为,所有事件都应该触发更改检测,但我想从这条规则中排除我的滚动事件。

简而言之,如何在 Angular2 中定义一个事件,并使其能够触发更改检测并使其手动进行。

我在找 :

0 投票
2 回答
2183 浏览

typescript - Angular2 使用值等价或引用相等来检测变化?

我正在使用 Angular2-RC.1,当我设置一个包含大数据的组件时,我发现性能很差。我有一个表格组件(包装 Handsontable),并公开了一个名为“数据”的可绑定输入属性。这个属性通常绑定到一个大数组(大约十万行)。

当我设置我的大型数据集时,更改检测会导致对主机组件中的整个数组(不是输入属性的所有者)进行值等价测试。

在这里,我展示了一个调用堆栈,显示更改检测是在整个数据上启动的。(粗体方法是我的主机组件的运行时自动生成的更改检测功能)而不是简单地比较引用。

调用栈

这是有意的行为吗?

0 投票
1 回答
1445 浏览

angular - 数据更改时Angular2组件不呈现

我有一个非常简单的 Angular2 组件:

在初始化时,我看到它ngOnInit()被称为 which calls peopleService.getPeople()。我还看到了调用的异步返回extractPeople()。但是,即使在this.people更新后,组件也不会重新渲染。为什么会这样?为什么未检测到更改?

编辑 这里有一些相关代码以获取额外的上下文:

people.component.html

人服务.ts

如果我console.log(this.people)在里面PeopleComponent.extractPeople(),我会正确地得到一群人:

但是,此时不会重新渲染组件。该视图仍显示人员数组的初始值,该数组为空。事实上,如果我用几个硬编码的人初始化数组,他们会在组件的初始渲染中正确显示。然而,当真正的 http 数据到达时,这个列表不会重新渲染!就好像变化检测根本没有触发。