Desidero creare una direttiva con vista dinamica con controller dinamico. il controller e la vista del modello provengono dal server.Direttiva AngularJs con controller dinamico e modello
La direttiva
var DirectivesModule = angular.module('BPM.Directives', []);
(function() {
'use strict';
angular
.module('BPM.Directives')
.directive('bpmCompletedTask', bpmCompletedTask);
bpmCompletedTask.$inject = ['$window'];
function bpmCompletedTask ($window) {
// Usage:
// <bpmCompletedTask></bpmCompletedTask>
// Creates:
//
var directive = {
link: link,
restrict: 'E',
scope: {
type: '=',
taskdata: '=',
controllername:'@'
},
template: '<div ng-include="getContentUrl()"></div>',
controller: '@',
name: 'controllername'
};
return directive;
function link(scope, element, attrs) {
scope.getContentUrl = function() {
return '/app/views/TasksViews/' + scope.type + '.html';
}
scope.getControllerName = function()
{
console.warn("Controller Name is " + scope.type);
return scope.type;
}
}
}
})();
Ecco come sto cercando di utilizzare la direttiva
<div ng-controller="WorkflowHistoryController as vm">
<h2>Workflow History</h2>
<h3>{{Id}}</h3>
<div ng-repeat="workflowStep in CompletedWorkflowSteps">
<bpm-completed-task controllername="workflowStep.WorkflowTaskType.DataMessageViewViewName" taskdata="workflowStep.WorkflowTaskOutcome.TaskOutcome" type="workflowStep.WorkflowTaskType.DataMessageViewViewName">
</bpm-completed-task>
</div>
</div>
Il problema ora è quando la direttiva prende il nome del controller lo ottengono stringa letterale non come parametro
È fattibile? se non è fattibile, qual è la soluzione migliore per creare viste dinamiche con i suoi controller e visualizzarle dinamicamente all'interno di ng-repeat?
Grazie,
Aggiornamento 20 gennaio Ho appena aggiornato il mio codice nel caso in cui se qualcuno interessato in esso. Tutto il credito va a @Meligy.
La prima direttiva:
(function() {
'use strict';
angular
.module('BPM.Directives')
.directive('bpmCompletedTask', bpmCompletedTask);
bpmCompletedTask.$inject = ['$compile', '$parse'];
function bpmCompletedTask ($compile, $parse) {
var directive = {
link: function (scope, elem, attrs) {
console.warn('in the first directive - before if');
if (!elem.attr('bpm-completed-task-inner'))
{
console.warn('in the first directive');
var name = $parse(elem.attr('controllername'))(scope);
console.warn('Controller Name : ' + name);
elem = elem.removeAttr('bpm-completed-task');
elem.attr('controllernameinner', name);
elem.attr('bpm-completed-task-inner', '');
$compile(elem)(scope);
}
},
restrict: 'A',
};
return directive;
}
})();
La seconda direttiva
angular
.module('BPM.Directives')
.directive('bpmCompletedTaskInner',['$compile', '$parse',
function ($window, $compile, $parse) {
console.warn('in the second directive');
return {
link: function (scope, elem, attrs) {
console.warn('in the second directive');
scope.getContentUrl = function() {
return '/app/views/TasksViews/' + scope.type + '.html';
}
},
restrict: 'A',
scope: {
type: '=',
taskdata: '=',
controllernameinner: '@'
},
template: '<div ng-include="getContentUrl()"></div>',
controller: '@',
name: 'controllernameinner'
};
}]);
Il Html
<div ng-repeat="workflowStep in CompletedWorkflowSteps">
<div bpm-completed-task controllername="workflowStep.WorkflowTaskType.DataMessageViewViewName" taskdata="workflowStep.WorkflowTaskOutcome.TaskOutcome"
type="workflowStep.WorkflowTaskType.DataMessageViewViewName">
</div>
</div>
Grazie per la risposta Meligy. Il mio problema inizia quando il nome del controller è un valore oggetto non un testo semplice. Nell'esempio che hai condiviso pensi ai nomi dei controller che arrivano dal server e li sto passando alla direttiva come parametri. – Hammad
Penso di aver trovato il problema. Controlla l'aggiornamento nella mia risposta – Meligy
No, fermo. Vedi, la direttiva riceve correttamente il valore e inizia a cercare un controller chiamato "workflowStep.WorkflowTaskType.DataMessageViewViewName", tuttavia questo non è il mio controller e lui a cercare un controller dopo aver valutato il valore di questo oggetto. Ho provato il seguente ' bpm -completed-task> ' e inoltre non funziona –
Hammad