I'm new to AngularJS and hoping someone can help me with this!
I'm developing a Widget Container which allow to add new predefined widgets to the container. Each widget has its own behavior so I need one controller per widget type. A widget could be a ChartBar or DataTable so its controller must know how to fill the widget with data, that's why I'm using a controller for each widget type.
What I did: I could add new widgets to container but only added one type of widget even when I clicked in the "Add Widget 2" and "Add Widget 3" buttons.
Please see the Plunkr for a demo.
Maybe my approach of how achieve this is totally wrong. In that case, a guidance will be very appreciated.
My HTML:
<div class="col-lg-12">
<button class="btn btn-xs btn-success" ng-click="addWidget(1)">Add Widget 1</button>
<button class="btn btn-xs btn-success" ng-click="addWidget(2)">Add Widget 2</button>
<button class="btn btn-xs btn-success" ng-click="addWidget(3)">Add Widget 3</button>
</div>
<div class="portlets-wrapper">
<!-- START row-->
<div class="row">
<widget-container id="portlet-1" portlet="portlet" container="widgetList" class="col-lg-4"></widget-container>
</div>
<!-- END row-->
</div>
</div>
My widget-container directive:
angular.module('myApp').directive('widgetContainer', function ($rootScope, $compile) {
var controller = 'Widget1Controller';
var linker = function(scope, element, attrs) {
scope.$watch('ctrl.container', function(newValue, oldValue) {
if(newValue.length>0){
var item = newValue[newValue.length-1];
var widgetId = Math.floor((Math.random() * 100) + 1);
if(item.type ==1) controller= 'Widget1Controller';
if(item.type ==2) controller= 'Widget2Controller';
if(item.type ==3) controller= 'Widget3Controller';
element.html(element.html() + getTemplate(scope, item.type)).show();
$compile(element.contents())(scope);
}
}, true);
};
var getTemplate = function(scope, type) {
var template1 = '<div id="panelPortlet" class="panel panel-default">\
<div class="panel-heading portlet-handler">{{ widgetName || "Another Widget"}} \
<paneltool tool-collapse="tool-collapse" tool-dismiss="tool-dismiss" tool-refresh="traditional" tool-settings="tool-settings"></paneltool>\
</div>\
<div collapse="panelPortlet" class="panel-wrapper">\
<div class="panel-body">\
Another Widget {{ getData() }}\
</div>\
</div>\
</div>';
var template2 = '<div id="panelPortlet" class="panel panel-default">\
<div class="panel-heading portlet-handler">{{ widgetName || "Chart Bar"}} \
<paneltool tool-collapse="tool-collapse" tool-dismiss="tool-dismiss" tool-refresh="traditional" tool-settings="tool-settings"></paneltool>\
</div>\
<div collapse="panelPortlet" class="panel-wrapper">\
<div class="panel-body">\
ChartBar {{ getData() }}\
</div>\
</div>\
</div>';
var template3 = '<div id="panelPortlet" class="panel panel-default">\
<div class="panel-heading portlet-handler">{{ widgetName || "Line Chart"}} \
<paneltool tool-collapse="tool-collapse" tool-dismiss="tool-dismiss" tool-refresh="traditional" tool-settings="tool-settings"></paneltool>\
</div>\
<div collapse="panelPortlet" class="panel-wrapper">\
<div class="panel-body">\
LineChart {{ getData() }}\
</div>\
</div>\
</div>';
if(type==1) return template1;
if(type==2) return template2;
if(type==3) return template3;
};
return {
restrict: "E",
link: linker,
scope: {
container:'='
}
,controller: controller
,bindToController: true
,controllerAs: 'ctrl'
};
});