问题标签 [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.
angular - ng.core.ChangeDetectionStrategy.onPush 是如何工作的?
如果更改检测策略设置为 onPush,则如果组件属性发生更改,则仅应重新渲染组件。
这是一个示例代码:
这里即使属性不改变模板也被渲染?这是一个错误还是我误解了 onPush?
javascript - angular2中的`changeDetection:ChangeDetectionStrategy.OnPush`是否仅在一个方向上起作用:顶部->底部?
考虑一下这个笨蛋
这里是组件之间的关系
我们注意到Child1
有changeDetection: ChangeDetectionStrategy.OnPush
上面的代码很简单,parent
发送一个对象child1
,发送完全相同的对象到child11
.
child11
然后更新对象的原语。
我们看到parent
andchild1
的对象都被更新了,即使child1
有changeDetection: ChangeDetectionStrategy.OnPush
我猜changeDetection: ChangeDetectionStrategy.OnPush
只有一种方式:从上到下。
真的吗?
如果是这样,这是有原因的吗?
angular - Angular2:观察角度之外的外部变量
我希望能够在 angular2 之外的变量发生变化时进行观察和更新。所以假设我在一个外部 javascript 文件中有这个:
如何将此变量绑定到组件中的属性?
根据这个答案,显然这应该可以工作。
但事实并非如此。如果我在控制台中更改变量,该变量不会更新显示在模板中。我错过了什么吗?
angular - 聆听组件角度 2 中的模型
我正在使用 angular 2。我有一个场景,我有一个组件、接口和指令。
该指令用于自动建议,我的界面用作模型。
因此,每当用户选择一个值时,我都会更新模型,并且有一种方法可以让我的组件监听模型的变化。
组件将如何监听我通过指令进行的模型更改?还可以使用模型来保存数据吗?
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 成为可观察的吗?
angular - 自定义更改检测以执行深度对象比较而不是 Angular2 中的引用等于检查
我创建了一个过滤器管道来对一组对象执行过滤。该管道获取一个filterArgs
对象,该对象包含一些属性,应根据这些属性过滤项目。
此外,我有一些输入字段,用户可以在其中设置过滤器参数。我直接绑定filterArgs
对象的属性并为这样的项目应用过滤器:
在我的组件中,filterArgs
对象定义如下(示意图):
所以现在的问题是,当输入字段之一发生更改时,过滤器不会被应用。据我了解 Angular 的变化检测,这是因为filterArgs
对象的引用没有改变,因此 Angular 没有检测到任何变化。这是预期的行为和设计。
我现在的问题是:解决此问题的建议方法是什么?
幼稚的方法是在filterArgs
每次输入字段更改时创建一个新对象,以便更新该对象的引用。在这种情况下,Angular 的变更检测就会发挥作用。但必须有更好的方法来做到这一点。我想我可以filterArgs
用某种属性来注释属性,告诉 Angular 执行“深度对象比较”以检测更改。
angular - {{myArray}} 现在在 beta.16 的视图中更新
更改检测已更改。
在 beta.16 之前,如果您的视图包含{{myArray}}
,如果您不修改数组引用,则该绑定不会更新。例如,如果您将push()
项目添加到数组中,则视图不会更新以显示新项目。解释是(嗯,是)因为数组引用没有改变,Angular 变化检测不会重新评估绑定。这个beta.15 plunker演示了这种行为。
从 beta.16(以及因此的 RC.1)开始,情况有所不同。{{myArray}}
即使数组引用没有改变,绑定现在也会更新!请参阅此RC.1 plunker。
我查看了beta.16 的 ChangeLog,我没有看到任何可以解释这种行为变化的东西(但也许我错过了一些东西)。有谁知道是什么导致了这种变化,还有什么可能会受到影响?
插件代码:
angular - 防止本机浏览器事件(如滚动)触发更改检测
我正在绑定一个滚动事件来捕获滚动并对其进行处理,我创建了如下指令:
所以我有一个简单的指令,除了:
这工作正常,希望我可以看到它在我的所有应用程序中对滚动进行更改检测。
这是我的组件之一:
我aFunction
在某个组件的某个地方有一个模板:
以前,aFunction
只有当我更新一些输入或单击按钮时才会被解雇,但现在,它会在滚动时检测到变化!!!所以我的滚动体验因此而滞后!
这是 Angular2 的正常行为,所有事件都应该触发更改检测,但我想从这条规则中排除我的滚动事件。
简而言之,如何在 Angular2 中定义一个事件,并使其能够触发更改检测并使其手动进行。
我在找 :
angular - 数据更改时Angular2组件不呈现
我有一个非常简单的 Angular2 组件:
在初始化时,我看到它ngOnInit()
被称为 which calls peopleService.getPeople()
。我还看到了调用的异步返回extractPeople()
。但是,即使在this.people
更新后,组件也不会重新渲染。为什么会这样?为什么未检测到更改?
编辑 这里有一些相关代码以获取额外的上下文:
people.component.html
人服务.ts
如果我console.log(this.people)
在里面PeopleComponent.extractPeople()
,我会正确地得到一群人:
但是,此时不会重新渲染组件。该视图仍显示人员数组的初始值,该数组为空。事实上,如果我用几个硬编码的人初始化数组,他们会在组件的初始渲染中正确显示。然而,当真正的 http 数据到达时,这个列表不会重新渲染!就好像变化检测根本没有触发。