gpt4 book ai didi

javascript - 如何将 AngularJS Controller 绑定(bind)到动态添加的 HTML?

转载 作者:可可西里 更新时间:2023-11-01 01:42:11 24 4
gpt4 key购买 nike

对于这种情况,我有一个 HTML 页面,其中包含一些 AngularJS 指令、 Controller 等。

像这样:

<html>
<body>
<div ng-controller="myCtrl">
<ul><li ng-repeat="item in items">{{item.name}}</li></ul>
</div>
<div class="placeholder">
...new HTML here...
</div>
</body>
</html>

请注意,页面上没有 ng-app 指令。我不依赖自动引导,而是使用手动引导方法。

angular.bootstrap(document, ['myApp']);

首先,我创建了将引导至文档的模块。然后,当加载一个动态确定的依赖项列表时,我附加了一些服务、 Controller 等。一旦一切准备就绪,我就调用 Bootstrap 方法。

一切正常,直到 AngularJS 之外的 JavaScript 附加到 DOM 的 ...new HTML here... 位置。 AngularJS 不处理新的 HTML。

我的理解是,您需要调用 $scope.$apply()$digest() 或其他方法来让 AngularJS 识别新的 HTML。但是,在我的示例中,没有围绕传入的新 HTML 的 Controller 。传入的 HTML 可能如下所示:

  <div ng-controller="myOtherCtrl">
<h2>{{model.title}}</h2>
</div>

换句话说,它依赖于应用程序模块中的不同 Controller 。

  • 我无法再次调用 angular.bootstrap 方法,因为页面已经绑定(bind)。
  • 我无法从 Controller 内部调用 $scope.$apply,因为关键是 Controller 代码没有被调用。
  • 我找不到获取 Controller 引用以便重新应用或刷新它的方法。

我已阅读 Ifeanyi Isitor lazy loading postBen Nadel post ,但它们似乎没有解决在现有 Controller 上下文之外加载的 HTML。

我不能选择使用 AngularJS 指令来处理 DOM 操作。它是架构的一个独立部分,它使用 ExtJS 作为注入(inject)新 DOM 元素的框架。例如,这意味着我不能使用 ngInclude。

似乎我可以调用 angular.module('myApp').$refresh();.$apply() 但事实并非如此一个选项。我错过了什么?

最佳答案

我遇到了同样的问题,这是我想出的:

<div id="mController" ng-controller="mainController">
</div>

<div id="ee">
2nd controller's view should be rendred here
</div>

然后调用 setCnt() 函数将注入(inject)并编译 html,并将链接到第二个 Controller :

var app = angular.module('app', []);

function setCnt() {
// Injecting the view's html
var e1 = angular.element(document.getElementById("ee"));
e1.html('<div ng-controller="ctl2">my name: {{name}}</div>');

// Compile controller 2 html
var mController = angular.element(document.getElementById("mController"));
mController.scope().activateView(e1);
}

app.controller("mainController", function($scope, $compile) {
$scope.name = "this is name 1";

$scope.activateView = function(ele) {
$compile(ele.contents())($scope);
$scope.$apply();
};
});

app.controller("ctl2", function($scope) {
$scope.name = "this is name 2";
});

这是一个测试这个的例子:https://refork.codicode.com/x4bc

希望这对您有所帮助。

关于javascript - 如何将 AngularJS Controller 绑定(bind)到动态添加的 HTML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20651578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com