У меня две кнопки. При нажатии он отображает модальный текст с текстом som. Но я также хочу добавить некоторые html динамически в зависимости от того, какая кнопка нажата.
Я попытался как $observe
и $watch
методы, но у меня возникают проблемы, делая работу.
вот мой код.
angular.module('TM', [])
.controller('protocolCtrl', function(){
this.text = 'Now looking at the protocol part';
this.modalId = 'protocolModal';
})
.controller('categoryCtrl', function(){
this.text = 'Now looking at the category part';
this.modalId = "categoryModal";
})
.directive('modalDirective', function(){
return {
restrict: 'E',
scope: {
ctrl: '=',
modalId: '@',
},
template: ['<div id="{{modalId}}" class="modal fade" role="dialog">',
'<div class="modal-dialog">',
'<div class="modal-content">',
'<div class="modal-header">',
'<h4 class="modal-title">Modal Header</h4>',
'</div>',
'<div class="modal-body">',
'<p> {{ ctrl.text }} </p>',
'</div>',
'<div class="modal-footer">',
'<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>',
'</div>',
'</div>',
'</div>',
'</div>'].join(''),
link: function(scope, element, attrs) {
element.$observe('modalId', function(){
var modal = element.find('#{{modalId}}');
if(modal == 'protocolModal'){
element.find('#{{modalId}}').append('<div>this is a protocol test...</div>');
} else {
element.find('#{{modalId}}').append('<div>this is a category test...</div>');
}
});
}
}
});
Я не думаю, что есть element.$observe
- есть attrs.$observe
scope.$watch
и scope.$watch
. У вас уже есть modelId
в области, поэтому позвольте использовать это.
Кроме того, вместо шаткого .find
по идентификатору, вводит элемент в качестве заполнителя для шаблона и replaceWith
его соответствующим образом:
template: '<div id="{{modalId}}">\
...\
<div class="modal-body">\
<template-placeholder></template-placeholder>\
</div>\
</div>",
link: function(scope, element){
// ...
var unwatch = scope.$watch("modalId", function(val){
var placeholder = element.find('template-placeholder');
if(val == 'protocolModal'){
placeholder.replaceWith('<div>this is a protocol test...</div>');
} else {
placeholder.replaceWith('<div>this is a category test...</div>');
}
unwatch(); // seems like you don't really need to set it again
}
}
Если ваши две DOM-структуры различаются, вы можете использовать два разных шаблона в зависимости от некоторого значения параметра.
templateUrl
можно указать как функцию, например:
angular.module('Joy', [])
.controller('ProfileCtrl', ['$scope', function ($scope) {
$scope.user = {
name: 'Elit'
};
}])
.directive('profile', [function () {
return {
restrict: 'A',
templateUrl: function (elem, attrs) {
return 'style-' + attrs.color + '.html';
}
};
}]);
И используйте эту директиву как:
<div ng-app="Joy" id="play-ground" ng-controller="ProfileCtrl">
<div profile color="red"></div>
<div profile color="green"></div>
</div>
В этом случае, если color
red
, директива загрузит шаблон из style-red.html
. В противном случае из style-green.html
.
В вашем случае вы можете сохранить флаг во внешнем контроллере. Щелчок по любой кнопке изменит значение этого флага и перейдет в директиву. Директива будет загружать различные шаблоны соответственно.
Смотрите, я обновил вашу скрипку
Используйте attr в функции ссылок. потому что вы уже дали атрибут вашему html, то есть: modal-id = "{{pctrl.modalId}}
<modal-directive ctrl="pctrl" modal-id="{{pctrl.modalId}}"></modal-directive>
if(attrs.modalId == 'protocolModal'){
element.find('#{{modalId}}').append('<div>this is a protocol test...</div>');
} else {
element.find('#{{modalId}}').append('<div>this is a category test...</div>');
}
Редактировать :
использовать $ timeout
$timeout(function () {
if (attrs.modalId == 'protocolModal') {
element.find('#' + attrs.modalId).append('<div>this is a protocol test...</div>');
} else {
element.find('#' + attrs.modalId).append('<div>this is a category test...</div>');
}
}, 1000)
Теперь почему $ timeout, потому что вы применяете шаблон, и в то же время ваша функция ссылок добавляет ваш div, поэтому он не будет применять ваш div. Сначала примените шаблон, а затем в шаблоне добавьте div
И если вы хотите показать, что div во всплывающем содержимом, используйте этот селектор. см. этот пример: https://jsfiddle.net/kevalbhatt18/o76hxj69/6/
element.find('#'+attrs.modalId +' .modal-body').append('<div>this is a protocol test...</div>');
$watch
или$observe
. Если шаблон управляется$scope.modalId
, используйтеng-if
чтобы выбрать то, что отображается, например:<div ng-if="modalId === 'protocolModal'">protocol test</div> <div ng-if="modalId === 'categoryModal'">category</div>
.$observe
или$watch
:)