当前位置: 首页 > 面试题库 >

Angular完成向DOM添加范围更新后,如何触发方法?

傅高逸
2023-03-14
问题内容

在将更改添加到$ scope变量(在本例中为$
scope.results)之后,我正在寻找一种执行代码的方法。我需要执行此操作以调用一些旧代码,这些旧代码要求项目必须在DOM中才能执行。

我真正的代码是触发AJAX调用,并更新作用域变量以更新ui。因此,我目前在推送到作用域之后,我的代码立即执行,但是遗留代码失败,因为dom元素尚不可用。

我可以使用setTimeout()添加一个难看的延迟,但这不能保证DOM确实已经准备好。

我的问题是,有什么方法可以绑定到“已渲染”的事件?

var myApp = angular.module('myApp', []);

myApp.controller("myController", ['$scope', function($scope){
    var resultsToLoad = [{id: 1, name: "one"},{id: 2, name: "two"},{id: 3, name: "three"}];
    $scope.results = [];

    $scope.loadResults = function(){
        for(var i=0; i < resultsToLoad.length; i++){
            $scope.results.push(resultsToLoad[i]);
        }
    }

    function doneAddingToDom(){
        // do something awesome like trigger a service call to log
    }
}]);
angular.bootstrap(document, ['myApp']);

链接到模拟代码:http :
//jsfiddle.net/acolchado/BhApF/5/

提前致谢!


问题答案:

在$evalAsync队列用于一个需要出现当前堆栈帧外的时间表工作,但浏览器的视图之前渲染。- http://docs.angularjs.org/guide/concepts#runtime

好吧,那么什么是“堆栈框架”?Github评论揭示了更多:

如果您从控制器入队,那么它将在之前,但是如果您从指令入队,则它将在之后。-
https://github.com/angular/angular.js/issues/734#issuecomment-3675158

上面,Misko正在讨论何时运行由$evalAsync排队等待执行的代码,以及Angular更新DOM的时间。我建议也阅读Github的两条评论,以获取完整的内容。

因此, 如果使用指令中的$evalAsync将代码放入队列中,则它应在Angular操纵DOM之后但在浏览器呈现之前运行。如果您需要在浏览器渲染后或控制器更新模型后运行某些程序,请使用$timeout(...,0);

另请参见,该示例还提供了一个使用$evalAsync()的小提琴示例。



 类似资料:
  • 问题内容: 我对Angular很陌生,并且使用firebase作为后端。我希望有人可以调试此问题。当我第一次进入我的页面 **www.mywebsite.com/#defaultHash时** ,数据不会加载到DOM中,但在访问另一个哈希链接并返回之后,它确实会加载。 我的控制器是这样的: 我有3条哈希路由,分别是“ Shared”,“ Registration”和“ Home”,否则else.r

  • 问题内容: 我有这段代码,我看不出问题的根源在哪里,我在控制器的chrome控制台中没有收到任何错误: 并正确加载到div加载的东西中; 控制台中的newMsgs会按照应有的方式进行解析; 我有它适用于其他页面,但似乎我错过了这个页面上的东西。我有标签: 执行此命令时,我在控制台中得到“未定义”: 问题答案: 忽略我在评论中指出的其他体系结构问题,真正的问题是您使用的是而不是Angular的。当您

  • 问题内容: 我需要从指令中的父控制器继承范围。我不一定要离开范围:false。我也不一定要使用孤立的作用域,因为要获得我确实关心的值正确链接(需要在父控制器中考虑很多值),就需要大量的工作。 如果要更新父范围,在我的指令中使用是否有意义? 请检查小提琴 问题答案: 尽管@user1737909已经引用了SO问题来阅读(AngularJS中范围原型/原型继承的细微差别是什么?它将解释该问题并建议各种

  • 我的sonarQube覆盖测试检测到该代码的捕获块在测试期间从未到达 代码: 我的静态函数ConvertFileToByte()可以抛出一个IOExctive。 相关测试: 我认为问题来自这样一个事实,即“thenThrow”函数是在执行之后完成的,因此永远不会到达catch块。我试图将调用返回与分配分开,但它从未在测试中触发catch函数,并根据sonar添加代码气味。 有什么想法和建议让这个测

  • 问题内容: 我正在尝试进行变量替换,同时也使它可以通过ngClick单击。 我做了一个小矮人演示(单击按钮,观察输入框保持不变) 标记: 角度的东西: 问题是:为什么单击按钮时不触发。应该在输入字段中设置值’foobar’。 问题答案: 同时,有一个针对该问题的官方解决方案: 无需编写自定义指令即可进行编译。 有关更多信息:https : //github.com/angular-translat

  • 我有一个lucene查询,可以对索引字段进行全文搜索。我想将日期范围添加到此查询。 我找到了这个问题并在那里使用了答案:如何在日期之间搜索(Hibernate搜索)? 但当我想在两个日期之间获取数据时,它什么也不返回。我使用的是MSSQL数据库,日期字段的类型是datetime。但它在实体类中被注释为。 这是我的实体类: 这就是我进行全文搜索的地方: 有两种不同的查询。一个是在指定字段上进行全文通