当前位置: 首页 > 知识库问答 >
问题:

角度观察和ng click事件序列

万俟光临
2023-03-14

我在angular指令中有这段代码,我发现$watch的行为有点令人困惑。在“ng click”中调用updateSelect:

scope.updateSelect = function (type) {
    scope.selectionCtrl.activeList = scope.seedLists[type]; 
    scope.selectionCtrl.activeListKey = type; 
    scope.selectionCtrl.activeSelection = scope.selection[type];
    scope.selectionCtrl.staged = [];
    scope.selectionCtrl.stageRemove = [];
    if (type !== scope.activeTab) {
        scope.activeTab = type;
    }
    console.log("update");
};

scope.$watch('selectionCtrl.activeList', function(newValue, oldValue) {
    console.log("watch");
}, true);

当我点击按钮(触发更新选择)并观看控制台时,我会看到“更新”,然后是“观看”。函数内部发生的第一件事是选择Ctrl。设置了activeList,所以我希望看到“watch”和“update”。

不应该在阵列更改后立即监视触发器吗?

共有3个答案

傅旺
2023-03-14

https://docs.angularjs.org/api/ng/type/$根范围。范围:

每次调用$digest()时都会调用watchExpression,并应返回将被监视的值。(由于$digest()在检测到更改时会重新运行,因此watchExpression可以每个$digest()执行多次,并且应该是幂等的。)

如果您尝试,即:

scope.selectionCtrl.activeList = scope.seedLists[type]; 
scope.$digest();

您将得到错误:[$rootScope:inprog]$应用程序已在进行中。

别锐
2023-03-14

Angular什么时候执行回调?

它与$摘要和$应用相关,当然它不会在原始javascript代码中执行。

要使watch强制执行,您可以手动运行$scope.apply(),但如果它在angularjs函数中,即$timeout、$间隔等,可能会导致更多问题,并且没有必要,因为它将在函数之后自动调用。

有关详细信息。,查找;

  • 如何在AngularJS中使用$ope.$watch和$ope.$应用?
  • https://groups.google.com/forum/#!话题/角度/HnJZTEXRztk
裴实
2023-03-14

该函数必须首先完成,因为javascript是单线程的。

由于该函数是通过ng click指令调用的,angular将运行摘要循环。摘要周期的一部分是运行监视列表,并解决自上次运行周期以来可能发生的所有更改。

在您给出的示例中,选择Ctrl。activeList在updateSelect中更改,这将导致调用监视回调。

 类似资料:
  • 我在使用角度异步管道时遇到了一个问题。基于从后端接收的内容,使用ngFor的模板中显示的内容的顺序不同。 代码如下: 我已经创建了一个组件称为头组件,它收到一个可观察的头$作为输入参数。 在导入标头组件的父组件内部

  • 我试图在Angular中实现类似委托模式的东西。当用户单击时,我想调用一个函数,然后该函数发出一个事件,该事件反过来应该由监听该事件的其他组件处理。 下面是一个场景:我有一个组件: 以下是观察部分: 关键问题是,我如何让观察组件观察所讨论的事件?

  • 我对可观察量很陌生。如何仅从一个简单的字符串创建可观察的?然后订阅它并在它发生变化时输出它。 这有意义吗? 我在谷歌搜索上一点运气都没有。可能是错误的关键字? 添加一些代码以更好地解释: 我想我在这里做错了什么?但不知道怎么问。我将不胜感激的任何解释。

  • 我有一个可观察的,可观察的是存储在本地存储器中的一组对象(视频)。我有这样的“功能”将新视频推送到阵列中:视频是一个接口 在其他组件中,我将其称为推送新对象(视频),如下所示: 但这行不通,我知道这是我的错。在observable之前,我使用了经典的常量和函数,工作得很好,现在我在observable方面遇到了麻烦。有人告诉我,我需要订阅一个管道,但我找不到任何地方如何做到这一点。对我来说,可见物

  • 学习角得到服务和组件和可观察性。 我正在尝试在我的演示应用程序中实现暗模式。该控件由一个服务完成,该服务根据浏览器默认值(如果找到)设置暗主题。 它在应用程序组件中初始化,以便以后在应用程序中放置控制开关。 暗模式从布尔值开始工作,因此为true或false。据我所知,使用一个可观察对象是不够的,因为我希望多个订阅者都以两种方式绑定到订阅,每种方式在服务中切换这些可观察对象。到目前为止,我很肯定这

  • 我来自同步编程背景,我很难理解可观察性。 这是我的服务/提供商的摘录(离子2项目) 我将从订阅它。关于这一点,我有几个问题。 > 即使我没有声明,上面的代码是否返回一个可观察/观察者? 响应是JSON。如何检查/处理JSON并执行一些操作,如 那就做吧 我认为应该在提供者类中完成。只是一个典型的提示/例子将是真棒。 当请求到达subscribe方法时,它是否真的发生了? 创建和返回Angular