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

AngularJS动态添加控制器

凌景辉
2023-03-14
问题内容

看来这个问题已经被问过几次了,但是没有正确的答案。

我的情况:我正在使用ajax(出于某种原因不使用角度路由模板)将模板(带有html和脚本)初始化为div。

index.html(主要)

<!DOCTYPE html>
<html ng-app="app" ng-controller="AppCtrl">
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Web</title>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
    </head>
    <body>
        <div class="container body-content">
            <div class="dynamic-content" >
                <!-- Loading content Here -->
            </div>
            <button ng-click="loadTemplate()">Load Template</button>
        </div>

        <script>
            angular.module('app', [])
            .controller('AppCtrl', function ($scope) {
                $scope.someData = {};
                $scope.loadTemplate = function() {
                    ....
                    //AJAX to get the templet.html
                    //and load it into .dynamic-content
                    //then applying scope();                  
                }
            });
        </script>
    </body>
</html>

template.html(模板)

<div ng-controller="TempCtrl">
    <h2>About</h2>
    <h3>{{total}}</h3>
    <p>Testing the total</p>
    <button ng-click="update()">Update</button>
</div>

<script>
    console.log('begin')
    angular.module('app')
    .controller('TempCtrl', function ($scope) {
        $scope.total = 0;
        console.log('inside')
        $scope.update = function () {
            $scope.total += 1;
        };
    });
    console.log('end')
</script>

当我单击按钮时,Load Template它将template.html文件加载到容器中,但是出现错误

错误:[ ng:areq
]参数’TempCtrl’不是函数,未定义

尽管已将其添加到应用控制器中。

我如何动态添加控制器并使它与动态HTML节点一起使用

在此处演示
https://plnkr.co/edit/EAa9Md36hDzpQ1BgIQKg?p=preview


问题答案:

这个博客描述了如何在启动后用angular来强迫它加载其他控制器:

http://www.bennadel.com/blog/2553-loading-angularjs-components-after-your-
application-has-been-
bootstrapped.htm

当然,这是完全不受支持的,并且随时可能会因角度更改而被破坏。

但是,这是使用此方法的代码的更新版本:

var app = angular.module('app', [])
app.config(
  function($controllerProvider, $provide, $compileProvider) {
    // Since the "shorthand" methods for component
    // definitions are no longer valid, we can just
    // override them to use the providers for post-
    // bootstrap loading.
    console.log("Config method executed.");
    // Let's keep the older references.
    app._controller = app.controller;
    app._service = app.service;
    app._factory = app.factory;
    app._value = app.value;
    app._directive = app.directive;
    app.controller = function(name, constructor) {
      console.log("controller...");
      console.log(name);
      console.dir(constructor);
      $controllerProvider.register(name, constructor);
      return (this);
    };
    // Provider-based service.
    app.service = function(name, constructor) {
      $provide.service(name, constructor);
      return (this);
    };
    // Provider-based factory.
    app.factory = function(name, factory) {
      $provide.factory(name, factory);
      return (this);
    };
    // Provider-based value.
    app.value = function(name, value) {
      $provide.value(name, value);
      return (this);
    };
    // Provider-based directive.
    app.directive = function(name, factory) {
      $compileProvider.directive(name, factory);
      return (this);
    };
  });
app.controller('AppCtrl', function($scope, $http, $compile) {
  $scope.someData = {};
  $scope.loadTemplate = function() {
    $http.get("template.html")
      .then(function(r) {
        // load in the html, including the script, which will be executed
        $(".dynamic-content").html(
          r.data
        );
        // compile the loaded html into an actual template and put it back where it was
        $(".dynamic-content").html($compile($(".dynamic-content").html())($scope));
      })
  }
});

请注意,我使用jQuery将HTML放入DOM中,从而使脚本得以执行,然后将HTML从DOM中抢回,以便可以对其进行编译,然后再将其重新放入DOM中。

另外,您的template.html中有一个未定义的变量,因此我对其进行了更新,如下所示:

<script>
    console.log('begin')
    angular.module('app')
    .controller('TempCtrl', function ($scope) {
        $scope.total = 0;
        console.log('inside')
        $scope.update = function () {
            $scope.total += 1;
        };
    });
    console.log('end')
</script>

<div ng-controller="TempCtrl">
    <h2>About</h2>
    <h3>{{total}}</h3>
    <p>Testing the total</p>
    <button ng-click="update()">Update</button>
</div>

这是一个工作的小伙伴:http :
//plnkr.co/edit/cB5N05



 类似资料:
  • 问题内容: 我有一个现有页面,需要在其中添加一个可以动态加载的控制器的角度应用程序。 这是一个片段,它根据API和我发现的一些相关问题实现了关于如何完成操作的最佳猜测: JSFiddle。请注意,这是对实际事件链的简化,在以上各行之间有各种异步调用和用户输入。 当我尝试运行上述代码时,由$ compile返回的链接器将抛出:。如果我正确地理解了引导程序,那么它返回的注射器应该知道该模块,对吗? 相

  • 问题内容: 我刚开始使用angularJS,并努力为我要做的事情找出合适的架构。我只有一个页面应用程序,但 URL始终应该保持不变 ;我不希望用户能够导航到根以外的任何路由。在我的应用中,有一个主要的div需要承载不同的视图。访问新视图时,我希望它接管主div中的显示。以这种方式加载的视图可以被丢弃或停留在DOM中,就像隐藏在DOM中一样- 我很想知道每个视图如何工作。 我提出了一个我想做的粗略的

  • 问题内容: 我目前有一个内置路由的AngularJS应用,它与静态属性分配完美配合。但是我真正想做的是为控制器分配不同的路由: 我想做的是在这里对我的财产做同样的事情,例如: 但似乎我得到一个错误,说找不到 所以有什么办法可以在路由配置中动态加载控制器功能名称? 问题答案: 使用angular ui-router可以做到这一点。 ui-router允许您指定“ controllerProvider

  • 本文向大家介绍Angularjs 实现动态添加控件功能,包括了Angularjs 实现动态添加控件功能的使用技巧和注意事项,需要的朋友参考一下 实现下面这样的需求: 点击增加一块数据盘,会出现数据盘选项。 (1)最开始,想到原生JavaScript,jQuery (appendChild()等方法结合AngularJS来添加新的元素。但是突然发现控件里面的数据绑定,原生javascript没法控制

  • 我对java和javafx很陌生,有一个我无法解决的问题。我需要将新的自定义控件动态添加到 javafx 场景中。此外,我需要主控件和添加的控件之间的交互。我已经在网上找到了一些有用的信息,但无法将它们放在一起。 所以我举了一个小例子来解释: 主要类别: 主fxml: 及其控制器: 现在要动态添加的控件: 其影响: 和控制器: 用法是:应将fxml2添加到fxml1的hbox中。然后在fxml1中

  • 问题内容: 我正在尝试为包含的模板动态分配控制器,如下所示: 但是Angular抱怨这是不确定的。 我猜,是不是定义 尚未 (因为我可以附和了在模板中)。 我见过很多关于人们设置等于变量的示例,例如:。但是,如果不创建重复的并发循环,就无法弄清楚在需要时如何获得可用值。 PS我也尝试在模板中进行设置(认为​​到那时它一定已经解决了),但是没有骰子。 问题答案: 您的问题是ng-controller