Angular JS. Загрузите шаблон html из директивы нажатием кнопки.
Я пытаюсь загрузить HTML-шаблон при нажатии ссылки. Я сделал директиву, содержащую templateUrl
, которая загружает HTML файл. Я вызываю функцию при щелчке ссылки, которая добавляет div с нашей настраиваемой директивой "myCustomer" к div уже в index.html. все, что я сделал до сих пор, показано ниже, но это не работает.
index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Example - example-example12-production</title>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.1/angular.min.js"></script>
<script src="script.js"></script>
</head>
<body ng-app="docsTemplateUrlDirective">
<div ng-controller="Controller">
<a href="#" ng-click="showdiv()">show</a>
<div id="d"></div>
</div>
</body>
</html>
script.js
(function(angular) {
'use strict';
angular.module('docsTemplateUrlDirective', [])
.controller('Controller', ['$scope', function($scope) {
$scope.showdiv = function(){
$("#d").append("<div my-Customer></div>");
};
}])
.directive('myCustomer', function() {
return {
templateUrl: 'my-customer.html'
};
});
})(window.angular);
мой-customer.html
<p>DIV CONTENT</p>
Вот ссылка, я тестировал этот код здесь
Ответы
Ответ 1
Это связано с тем, что angular не связывает директивы, если вы добавляете такой контент,
вам нужно $compile
выполнить это, и это свяжет директивы с вашим $scope
поэтому контроллер, например,
.controller('Controller', ['$scope', '$compile', function($scope, $compile) {
$scope.showdiv = function(){
var compiledeHTML = $compile("<div my-Customer></div>")($scope);
$("#d").append(compiledeHTML);
};
}])
здесь DEMO
ИЛИ, чтобы сделать это,
используйте ng-if
для создания или удаления элемента из html,
попробуйте этот код
контроллер
....
$scope.anableCustomerDirective = false;
$scope.showdiv = function(){
$scope.anableCustomerDirective = true;
};
HTML
<body ng-app="docsTemplateUrlDirective">
<div ng-controller="Controller">
<a href="#" ng-click="showdiv()">show</a>
<div id="d">
<div my-Customer ng-if='anableCustomerDirective'></div>
</div>
</div>
</body>
Предложение
если ваше основное намерение состоит в размещении содержимого html после щелчка, вы можете использовать ng-include
здесь, и он будет намного чище и не нуждается в другом директива.
<div id="d">
<div ng-include="templateURL"></div>
</div>
$scope.showdiv = function(){
$scope.templateURL = 'my-customer.html';
};
найдите DEMO
Ответ 2
Кажется, что директива предназначена только для загрузки template
из нее. Я предлагаю вам использовать директиву ng-include
, затем
Разметка
<a href="#" ng-click="showDiv=true">show</a>
<div id="d"></div>
<div ng-include="showDiv ? 'my-customer.html': ''">
Ответ 3
когда вы делаете это вручную с добавлением, вы фактически не запускаете $apply или $digest, поэтому директива не запускается,
вы можете попытаться сделать это с помощью ng-show или ng-if... например
<body ng-app="docsTemplateUrlDirective">
<div ng-controller="Controller">
<a href="#" ng-click="showdiv = true">show</a>
<div my-customer ng-if="showdiv"></div>
<div id="d"></div>
</div>
</body>
таким образом angular запускает $apply, и директива будет отображаться.
Ответ 4
Наиболее распространенным способом является использование $compile
. Дополнительная информация: Динамически добавить директиву в AngularJS
Тогда ваш контроллер может выглядеть так:
angular.module('docsTemplateUrlDirective', [])
.controller('Controller', ['$scope', '$compile', function($scope, $compile) {
$scope.showdiv = function(){
var el = $compile( "<div my-customer></div>" )( $scope );
$('#d').append( el );
};
}]);
Обратите внимание, что директива invokation должна выглядеть так: <div my-customer>
, not <div my-Customer></div>
, как у вас в коде.