【问题标题】:Render a custom directive when loaded dynamically from controller从控制器动态加载时呈现自定义指令
【发布时间】:2017-10-11 16:21:59
【问题描述】:

我有三个自定义指令,例如 <sample-grid></sample-grid><sample-form></sample-form><sample-view></sample-view>。它们的定义方式如下:

angular.module("MyApp").directive('sampleGrid', [ function() {
    return {
        scope : {},
        restrict: 'EA',
        templateUrl : 'view/templates/sample-grid.tmpl.html',
        controller : 'SampleGridCtrl',
        scope: {
              scnid: '=',
          }
    };
} ]);

我有一个主视图,我正在以下列方式使用来自angular material<md-tabs> -

<md-tabs>
    <md-tab ng-repeat="tab in myCtrl.pageTabs track by $index">
        <md-tab-label>{{tab.tabName}}</md-tab-label>
            <md-tab-body>
                <div id="tab.tabName" ng-bind-html="tab.tabHTML"></div>
            </md-tab-body>
    </md-tab>
</md-tabs>

这个视图的控制器也定义为

angular.module("MyApp").controller("myCtrl",['$log','$scope','$sce', '$compile', function myCtrl ($log,$scope,$sce,$compile) {
    var homeScope = this;
    homeScope.pageTabs = [];

    var newTab = {};
    newTab.tabName = "Sample";
    newTab.tabHTML = $sce.trustAsHtml("<sample-grid></sample-grid>");
    newTab.tabAction = "grid";
    homeScope.pageTabs.push(newTab);

    var template = angular.element(document.querySelector('#Sample'));
    $compile(template)(homeScope);

}])

要求是:用户将能够在视图中添加新选项卡,并且我必须根据选择在视图中显示三个自定义指令之一。所以我必须将新的选项卡对象推送到 homeScope.pageTabs 并使用所需的属性。

问题是:推送选项卡对象后,创建了新选项卡,但自定义指令没有呈现到视图中。我可以在控制台中看到它:

<div id="tab.tabName" ng-bind-html="tab.tabHTML">
    <sample-grid></sample-grid>
</div>

我在这里看到了答案,因此我必须使用$compile 才能正确呈现它。我试过了,但我无法得到正确的解决方案。

所以我的问题是如何实现这个功能?而且,还有其他简单可行的方法来实现这一目标吗?

【问题讨论】:

标签: angularjs


【解决方案1】:

我稍微改变了你的控制器逻辑。你必须使用 compile 有点不同。

angular.module("MyApp").controller("myCtrl",['$log','$scope','$sce', '$compile', function myCtrl ($log,$scope,$sce,$compile) {
    var homeScope = this;
    homeScope.pageTabs = [];

    var template = $sce.trustAsHtml("<sample-grid></sample-grid>");
    var linkFn = $compile(template);
    var content = linkFn(scope);

    var newTab = {};
    newTab.tabName = "Sample";
    newTab.tabHTML = content;
    newTab.tabAction = "grid";
    homeScope.pageTabs.push(newTab);
}])

【讨论】:

  • `var content = linkFn(scope);'这里的范围是指 homeScope 吗?还是 $scope?
  • 应该是$scope
  • 谢谢哥们。这很有帮助。 @本杰明。我在上面分享的链接也有效,但需要一个额外的指令,尽管不需要 $sce 和 $compile。
猜你喜欢
  • 1970-01-01
  • 2014-04-09
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
相关资源
最近更新 更多