Tôi muốn tạo một chỉ thị có chế độ xem động với bộ điều khiển động. bộ điều khiển và khung nhìn mẫu đến từ máy chủ.Chỉ thị AngularJs với Bộ điều khiển động và mẫu
Chỉ thị
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;
}
}
}
})();
đây làm thế nào tôi đang cố gắng sử dụng các chỉ thị
<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>
Vấn đề bây giờ là khi chỉ thị được tên điều khiển nó làm cho nó như literal chuỗi không như một tham số.
Có thể thực hiện được không? nếu không thể thực hiện được, giải pháp nào tốt nhất để tạo chế độ xem động với bộ điều khiển và hiển thị chúng tự động trong ng-repeat?
Cảm ơn,
Cập nhật ngày 20 tháng 1 tôi chỉ cập nhật mã của tôi trong trường hợp nếu một ai quan tâm đến nó. Tất cả tín dụng đều chuyển sang @Meligy.
The First Chỉ thị:
(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;
}
})();
thứ hai Chỉ thị
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'
};
}]);
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>
Cảm ơn câu trả lời của bạn Meligy. Vấn đề của tôi bắt đầu khi tên bộ điều khiển là một giá trị đối tượng không phải là một văn bản thuần túy. Trong ví dụ bạn chia sẻ, hãy nghĩ về tên bộ điều khiển đến từ máy chủ và tôi chuyển chúng đến chỉ thị dưới dạng tham số. – Hammad
Tôi nghĩ rằng tôi có thể đã tìm thấy sự cố. Kiểm tra cập nhật trong câu trả lời của tôi – Meligy
Không, vẫn còn. Hãy xem, chỉ thị nhận giá trị chính xác và bắt đầu tìm kiếm một bộ điều khiển gọi là "workflowStep.WorkflowTaskType.DataMessageViewViewName" tuy nhiên đây không phải là bộ điều khiển của tôi và anh ta tìm kiếm một bộ điều khiển sau khi đánh giá giá trị của đối tượng này. Tôi đã thử các sau ' bpm -hoàn toàn-nhiệm vụ> ' và cũng không hoạt động –
Hammad