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

AngularJS手动渲染控制器和模板

翟善
2023-03-14
问题内容

我正在尝试在angularjs中实现一个插件系统,该系统将允许用户配置他们将在特定页面上看到的“小部件”。每个窗口小部件均由控制器和模板(URL)定义。是否可以创建一个实例化控制器,使用模板调用它并包含结果内容的指令?

目标是这样的:

<div class="widget" ng-repeat="widget in widgets">
    <widget controller="widget.controller" templateUrl="widget.templateUrl"></widget>
</div>

问题答案:

有两种方法可以做到这一点; 一种是使用已经可用的helper指令(例如ngIncludengController),第二种是手动的;手动版本
可能 会更快,但我不确定。

简单方法:

简单的方法是简单地创建一个具有ngControllerngInclude属性的新元素,然后将其附加到指令的元素,然后$compile

var html = '<div ng-controller="'+ctrl+'" ng-include="'+tpl+'"></div>';
element.append(html);
$compile( element.contents() )( scope );

手动方式:

手动方式是依次执行这些指令本身要做的事情。这种逻辑与操作非常相似ngView(尽管没有复杂性)。我们获取模板,将其存储在中$templateCache,然后将其附加到DOM。我们创建一个新的子作用域,并实例化提供的控制器,并将该控制器分配给元素。最后,我们$compile做到了:

$http.get( tpl, { cache: $templateCache } )
.then( function( response ) {
  templateScope = scope.$new();
  templateCtrl = $controller( ctrl, { $scope: templateScope } );
  element.html( response.data );
  element.children().data('$ngControllerController', templateCtrl);
  $compile( element.contents() )( templateScope );
});

(请注意,这里没有垃圾回收,如果小部件发生更改,您将需要实现该垃圾回收)

这是演示两种方法的Plunker:http
://plnkr.co/edit/C7x9C5JgUuT1yk0mBUmE?p=preview



 类似资料:
  • 模板渲染 在控制器里面模板渲染,可以使用基类封装好的 fetch 方法; ThinkCMF5 设置的模板文件名分隔符是/,模板后缀名为html 常见 fetch 调用方法如下: 1.不带任何参数: return $this->fetch(); 系统会按照默认规则自动定位模板文件,其规则是: 当前主题目录/当前应用/当前控制器(小写+下划线)/当前操作(小写)+.html 2.指定渲染当前控制器

  • 模板渲染 在控制器里面模板渲染,可以使用基类封装好的 fetch 方法; ThinkCMF6.0 设置的模板文件名分隔符是/,模板后缀名为html 常见 fetch 调用方法如下: 1.不带任何参数: return $this->fetch(); 系统会按照默认规则自动定位模板文件,其规则是: 当前主题目录/当前应用/当前控制器(小写+下划线)/当前操作(小写)+.html 2.指定渲染当前控

  • 问题内容: 我有一个Rails应用程序尝试合并一些AJAX,在其中单击“新建”将打开一个模式窗口和一个表单。我希望能够显示验证错误(如果失败),因此在我的create动作中,我考虑过重新呈现new.js.erb文件。这是正确的方法吗? 我得到的结果是浏览器中的转义js文本,例如: 我尝试将各种选项放入渲染块,但没有运气。有小费吗? 问题答案: 最好的做法是同时支持AJAX和Non-AJAX调用,以

  • 我正试图将发送通知电子邮件与导致它们的事件分离开来。到目前为止,我正在将一个邮件对象()从控制器传递给Akka actor(),然后它通过play mailer插件的play easymail包装发送邮件。邮件正文由邮件对象在传递给参与者后生成,HTML由Scala模板生成。 此模板包含带有绝对URL的链接,通过调用 但是,在尝试呈现模板时,我遇到了RuntimeException。 堆栈跟踪如下

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

  • 英文原文: http://emberjs.com/guides/templates/rendering-with-helpers/ Ember.js提供了数个助手来协助你以不同的方式来渲染其他视图或模板 {{partial}} 助手 {{partial}}接收一个模板作为其参数,然后恰当地渲染这个模板 {{partial}}不改变上下文或作用域。它只是简单地在当前作用域下将指定的模板渲染出来。 1