注入的cshtml文件中的Angular,$ compile无效

时间:2017-01-04 15:46:29

标签: javascript jquery html angularjs asp.net-mvc

TL; TR;在

之下

我正在处理一个巨大的应用程序,其中所有内容都是超级通用的,以便轻松扩展。其中一个组件是对话框。在你回答之前,使用ngInclude或角度模板,让我解释一下这些是如何工作的以及为什么我们要坚持它们。

创建此对话框的流程:

  1. 从javascript中的某个地方调用javascript函数。
  2. 构造对话框的容器。位置,宽度,高度,灰色背景等
  3. 一旦存在,将显示加载指示符,同时向后端发出GET请求。
  4. 在后端Action中,提供了视图名称和模型。
  5. 此视图(.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();
    }
    
  6. 然后返回字符串,在javascript中最终设置为html:diag.html(jsonResponse.data);

  7. 现在我加载的视图包含角度元素,如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}}完全按照显示方式显示,因此角度不起作用。
    • 控制器和所有其他所需的javascript文件已加载到打开此对话框的页面上。也尝试在这里添加它们,没有区别。我还尝试再次加载角度,这确实给了我一个警告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);
    }
    

    但是一旦完成并显示对话框,它仍然没有角度工作。

    example

    值得注意的是ng-repeat在开始时已经完成了工作,没有任何项目。看起来它会编译并忘记。

1 个答案:

答案 0 :(得分:1)

使用$scope.$apply();后尝试执行$compile。您可能需要通知angular更新其绑定。还要尽量避免直接使用jQuery,而是使用angular.element("#....")