使用 AngularJS 在控制器中动态创建项目
Creating item dynamically in controller with AngularJS
我创建了一个自定义指令,如下所示。
app.directive('myDirective', function () {
return {
template: '<h1>This is myDirective</h1>',
restrict: 'E',
replace: true,
link: function (scope, element, attrs) {
}
};
});
我的 HTML 代码如下。
<ion-view view-title="Search">
<ion-content>
<div id="myid"></div>
</ion-content>
</ion-view>
最后,我的控制器如下图所示。我想在控制器内动态创建 my-directive
元素,如下所示。但它不起作用。你知道解决这个问题的方法吗?
提前致谢!!
app.controller('Search', function ($scope) {
var content = document.getElementById("myid");
content.setAttribute("class", "list");
var mydir = document.createElement("my-directive");
content.appendChild(mydir);
})
你可以像这样在控制器中调用指令
app.controller('Search', function ($scope) {
var content = document.getElementById("myid");
content.setAttribute("class", "list");
var mydir = <my-directive></my-directive>;
content.appendChild(mydir);
})
从控制器操纵 DOM 是一个非常糟糕的主意。你永远不应该这样做,因为它会在控制器和视图之间产生紧密的耦合。
不太清楚你到底想达到什么目的。
您可能希望将 ng-include 与控制器作用域上设置的模板的动态路径一起使用
并在控制器中
$scope.path = 'templates/my_template_1.html';
不确定这背后的原因是什么:
my template data coming from server dynamicly and using inside the
controller is the best solution for me
嗯,不推荐,但是可以。请参阅下面的示例:
var app = angular.module("sa", []);
app.controller("Search", function($scope, $compile) {
$scope.doTheBadThing = function() {
var $parent = angular.element(document.getElementById("myid"));
$parent.addClass("list");
var mydir = document.createElement("my-directive");
// or
//var mydir = "<my-directive></my-directive>";
$parent.append(mydir);
// This is the main thing. You need to compile the dynamic HTML so that Angular can initialized on those template
$compile($parent.contents())($scope);
};
});
app.directive('myDirective', function() {
return {
template: '<h1>This is myDirective</h1>',
restrict: 'E',
replace: true,
link: function(scope, element, attrs) {
}
};
});
#myid {
background: #ccc;
min-height: 200px;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="sa" ng-controller="Search">
<button ng-click="doTheBadThing()">Do the bad thing</button>
<div id="myid"></div>
</div>
我创建了一个自定义指令,如下所示。
app.directive('myDirective', function () {
return {
template: '<h1>This is myDirective</h1>',
restrict: 'E',
replace: true,
link: function (scope, element, attrs) {
}
};
});
我的 HTML 代码如下。
<ion-view view-title="Search">
<ion-content>
<div id="myid"></div>
</ion-content>
</ion-view>
最后,我的控制器如下图所示。我想在控制器内动态创建 my-directive
元素,如下所示。但它不起作用。你知道解决这个问题的方法吗?
提前致谢!!
app.controller('Search', function ($scope) {
var content = document.getElementById("myid");
content.setAttribute("class", "list");
var mydir = document.createElement("my-directive");
content.appendChild(mydir);
})
你可以像这样在控制器中调用指令
app.controller('Search', function ($scope) {
var content = document.getElementById("myid");
content.setAttribute("class", "list");
var mydir = <my-directive></my-directive>;
content.appendChild(mydir);
})
从控制器操纵 DOM 是一个非常糟糕的主意。你永远不应该这样做,因为它会在控制器和视图之间产生紧密的耦合。
不太清楚你到底想达到什么目的。 您可能希望将 ng-include 与控制器作用域上设置的模板的动态路径一起使用 并在控制器中 $scope.path = 'templates/my_template_1.html';
不确定这背后的原因是什么:
my template data coming from server dynamicly and using inside the controller is the best solution for me
嗯,不推荐,但是可以。请参阅下面的示例:
var app = angular.module("sa", []);
app.controller("Search", function($scope, $compile) {
$scope.doTheBadThing = function() {
var $parent = angular.element(document.getElementById("myid"));
$parent.addClass("list");
var mydir = document.createElement("my-directive");
// or
//var mydir = "<my-directive></my-directive>";
$parent.append(mydir);
// This is the main thing. You need to compile the dynamic HTML so that Angular can initialized on those template
$compile($parent.contents())($scope);
};
});
app.directive('myDirective', function() {
return {
template: '<h1>This is myDirective</h1>',
restrict: 'E',
replace: true,
link: function(scope, element, attrs) {
}
};
});
#myid {
background: #ccc;
min-height: 200px;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="sa" ng-controller="Search">
<button ng-click="doTheBadThing()">Do the bad thing</button>
<div id="myid"></div>
</div>