javascript — 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>

Вот ссылка, я тестировал этот код Вот

21

Решение

Это потому, что 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

34

Другие решения

Похоже, директива предназначена только для загрузки template от него. Я бы предложил вам использовать ng-include директива тогда

наценка

<a href="#" ng-click="showDiv=true">show</a>
<div id="d"></div>
<div ng-include="showDiv ? 'my-customer.html': ''">
8

когда вы делаете это вручную с помощью append, вы фактически не запускаете $ 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, и директива будет отображена.

0

Наиболее распространенным способом является использование $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 );
};
}]);

Обратите внимание, что вызов директивы должен выглядеть следующим образом: <div my-customer>не <div my-Customer></div> как у вас в коде.

0