Я хочу использовать свою директиву несколько раз. Каждый раз, когда я нажимаю кнопку, я хочу, чтобы шаблон был соответствующим образом обновлен. Внутри $ scope.item содержится item.id = 1. Следовательно, он отображается как
Затем, когда я нажимаю на кнопку, я меняю item.id на 4. Теперь результат выглядит следующим образом.
Но, как вы видите, исходный элемент1 был изменен на item4.
Я хочу сначала отобразить элемент1, а при нажатии кнопки я хочу отобразить элемент4, не изменяя отображаемое начальное значение. Как я могу это достичь?
У меня есть следующая директива
var app = angular.module('myApp', []);
app.directive('myDirective', function () {
return {
restrict: 'AE',
scope:true,
template: '<div>{{ item.id }}</div>'
}
});
Мой контроллер
function MyCtrl($scope,$compile) {
$scope.item = {id: 'item1'};
$scope.hello = function() {
$scope.item = {id: 'item4'};
var dialogTextHTML ="<my-directive item ='item'></my-directive>"
var compiledDialogData = $compile(dialogTextHTML)($scope);
document.getElementById('mycontainer').appendChild(compiledDialogData[0]);
}
}
Мой html
<div ng-controller="MyCtrl">
<button ng-click="hello()">
Click here
</button>
<div id='container'>
<my-directive item='item'></my-directive>
</div>
</div>
Вы должны стараться избегать манипуляций с DOM в контроллерах - это не "Угловой способ".
В этом случае я бы использовал ng-repeat в <my-directive>
:
<my-directive ng-repeat="item in items" item='item'></my-directive>
Затем на каждом клике просто добавьте элемент в список элементов:
function MyCtrl($scope, $compile) {
$scope.items = [];
var idCount = 0;
function addItem() {
idCount += 1;
$scope.items.push({
id: 'item' + idCount
});
}
$scope.hello = function() {
addItem();
}
addItem();
}
Рабочий jsfiddle: https://jsfiddle.net/ub3zmo9s/1/