TL; TR;在
之下我正在处理一个巨大的应用程序,其中所有内容都是超级通用的,以便轻松扩展。其中一个组件是对话框。在你回答之前,使用ngInclude
或角度模板,让我解释一下这些是如何工作的以及为什么我们要坚持它们。
创建此对话框的流程:
此视图(.cshtml文件)将加载到字符串构建器中。为了让您了解会发生什么,这里有一段代码可以加载视图。
var sb = new StringBuilder(1);
using (StringWriter sw = new StringWriter(sb))
{
.....
var helper = new HtmlHelper(viewContext, viewDataContainer);
using (helper.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
helper.RenderPartial(viewName, model);
}
return sb.ToString();
}
然后返回字符串,在javascript中最终设置为html:diag.html(jsonResponse.data);
现在我加载的视图包含角度元素,如ng-controller
和括号,以显示来自该控制器的内容。这是.cshtml:
@model int
<div ng-controller="dialogGridColumnSelectionController as dgc" ng-init="dgc.init(@Model)">
<table>
<thead>
...
<tbody>
<tr ng-repeat="col in dgc.tableColumns">
<td>
<input type="checkbox" name="some" ng-value="dgc.hide"/>
</td>
<td>{{col.headerName}}</td>
<td>{{col.Description}}</td>
</tr>
</tbody>
</table>
</div>
一些陈述:
ng-app
,因为<body>
元素已经有了这个,所以不应该在这里使用它。 <body>
元素内。{{col.headerName}}
完全按照显示方式显示,因此角度不起作用。tried to load it more than once
。所以脚本就在那里。现在我有点怀疑这会从一开始就起作用,但我只是想在开始对话的重大修改之前确定。
所以我的问题是,有可能吗?从.html()
(在javascript中)启动的视图是否具有角度?我如何开始&#34;角?或者为什么它不能用于生成的html?
TL; TR和EDIT:
经过一番挖掘,我最终做到了这一点:dialog.html(jsonResponse.data);//dialog is a created jquery element, jsonResponse.data contains the `.cshtml` content
if (options.angularCompile && options.angularScope) {//I've set them in options
options.angularCompile(dialog)(options.angularScope);//= $compile(dialog)($scope) or $compile(dialog.contents())($scope)
}
从上面的html中,它会触发init
函数。该函数正确加载数据(来自其他注入的工厂)。
var self = this;
this.tablePageID = 0;
this.tableColumns = [];
$scope.hello = "hii";
this.init = function (tablePageID) {
self.tablePageID = tablePageID;
self.tableColumns = gridTableFactory.getTableColumns(tablePageID);
}
但是一旦完成并显示对话框,它仍然没有角度工作。
值得注意的是ng-repeat
在开始时已经完成了工作,没有任何项目。看起来它会编译并忘记。
答案 0 :(得分:1)
使用$scope.$apply();
后尝试执行$compile
。您可能需要通知angular更新其绑定。还要尽量避免直接使用jQuery,而是使用angular.element("#....")
。