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

AngularJS:AngularJS渲染模板后如何运行附加代码?

万俟修诚
2023-03-14

我在DOM中有一个Angular模板。当我的控制器从服务获取新数据时,它会更新$scope中的模型,并重新呈现模板。到目前为止一切都很好。

问题是,在模板被重新渲染并放入DOM(在本例中是一个jQuery插件)后,我还需要做一些额外的工作。

似乎应该有一个事件可以听,比如后浪汉,但我找不到任何这样的东西。也许指令是一条出路,但它似乎也太早了。

这是一个js小提琴概述我的问题:小提琴 - 角度问题

==更新==

基于有用的评论,我相应地切换到一个指令来处理DOM操作,并在指令中实现了一个模型$watch。但是,我仍然有同样的基本问题;$watch事件中的代码在模板被编译并插入DOM之前触发,因此,jquery插件总是评估一个空表。

有趣的是,如果我删除异步调用,整个html" target="_blank">过程就可以正常工作,所以这是朝着正确方向迈出的一步。

以下是我更新的Fiddle,以反映这些变化:http://jsfiddle.net/uNREn/12/

共有3个答案

封瑞
2023-03-14

按照Misko的建议,如果您想要异步操作,那么可以使用$timeout()代替它(它不起作用)

$timeout(function () { $scope.assignmentsLoaded(data); }, 1000);

使用$evalAsync()(这确实有效)

$scope.$evalAsync(function() { $scope.assignmentsLoaded(data); } );

不停摆弄我还添加了一个“删除数据行”链接,该链接将修改$scope。赋值,模拟数据/模型的更改,以显示更改数据的效果。

Conceptual Overview页面的Runtime部分解释了当需要在当前堆栈帧之外发生某些事情时,但在浏览器呈现之前,应该使用evalAsync。(此处猜测……“当前堆栈帧”可能包括Angular DOM更新。)如果在浏览器呈现后需要进行某些操作,请使用$timeout。

然而,正如您已经发现的那样,我认为这里不需要异步操作。

公西培
2023-03-14

这篇文章是旧的,但是我把你的代码改成:

scope.$watch("assignments", function (value) {//I change here
  var val = value || null;            
  if (val)
    element.dataTable({"bDestroy": true});
  });
}

jsfiddle。

希望对你有帮助

龙隐水
2023-03-14

首先,混淆渲染的正确位置是指令。我的建议是用像这样的指令来包装DOM操作jQuery插件。

我也遇到了同样的问题,想出了这个片段。它使用$watch$evalAsync来确保在解析 >等模板之后运行代码。

app.directive('name', function() {
    return {
        link: function($scope, element, attrs) {
            // Trigger when number of children changes,
            // including by directives like ng-repeat
            var watch = $scope.$watch(function() {
                return element.children().length;
            }, function() {
                // Wait for templates to render
                $scope.$evalAsync(function() {
                    // Finally, directives are evaluated
                    // and templates are renderer here
                    var children = element.children();
                    console.log(children);
                });
            });
        },
    };
});

希望这可以帮助你防止一些挣扎。

 类似资料:
  • 问题内容: 我在DOM中有一个Angular模板。当我的控制器从服务中获取新数据时,它将更新$ scope中的模型,然后重新呈现模板。到目前为止一切都很好。 问题是,在模板重新渲染并且在DOM中(在本例中为jQuery插件)之后,我还需要做一些额外的工作。 似乎应该有一个事件要听,例如AfterRender,但我找不到任何此类事件。也许一条指令可以走,但它似乎还为时过早。 这是一个概述我的问题的j

  • 6.1 渲染模板 一旦你拥有一个模版文件,你可以通过给一个map来给它传递数据。 map是一个变量及赋予的值的集合,模板使用它来得到变量的值,或者对于块标签求值。 它的渲染函数有一个可选的变量键值对map 通过 ctx.Render() 方法来渲染模板,例如: func (r *Render) Serve(ctx *faygo.Context) error { return ctx.Ren

  • Tango默认核心不包含模板渲染功能,在官方中间件中包含两个渲染引擎中间件,一个是 Go标准模板引擎, 另一个是 Pongo2模板引擎

  • 在控制器里模板渲染最常用的方法是display,在CMF中支持如下的模板渲染方式: //不带任何参数 $this->display(); 此种方式系统会自动判断模板路径,并渲染出模板内容,此种方式模板路径是:主题名/应用名/控制器名/操作名+模板文件后缀名; $this->display('edit'); 此种方式表示调用此控制器下的edit操作的模板; $this->display(':in

  • Tpongo2 中间件是 pongo2.v3 模板引擎的 Tango 支持。 安装 go get github.com/tango-contrib/tpongo2 示例 package main import ( "github.com/lunny/tango" "gopkg.in/flosch/pongo2.v3" "github.com/tango-contrib/tp

  •  说明 调用方法: $.f2e.util.render(temp,data,fn,helper); 函数说明: 调用template渲染模板,依赖于artTemplate库 参数说明: 参数名 类型 说明 备注 temp string html字符串 无 data object 参数名 无 fn function 回调函数 无 helper function artTemplate自定义方法 无