Ho un credito direttiva treeview a http://codepen.io/bachly/pen/KwWrzG per essere il mio blocco di partenza. che sto cercando di aggiornare quando aggiungo oggetti alla collezione. Posso aggiornare l'oggetto e inserire i nuovi oggetti ma la direttiva treeview non viene mai chiamata dopo che l'elemento $scoped
è stato aggiornato. In definitiva i dati utilizzati verranno da un servizio a questo punto sto solo testando con dati falsi.Aggiornare una direttiva treeview angolare quando un nuovo oggetto viene aggiunto alla raccolta
La collezione originale assomiglia a questo
$scope.myList = {
children: [
{
name: "Event",
children: [
{
name: "Event Date",
parent:"Event",
children: [
{
name: "2008",
filterType: '_eventStartDate',
parent: 'Event'
},
{
name: "2009",
filterType: '_eventStartDate',
parent: 'Event'
}
]
},
{
name: "Event Attendee",
parent: "Event",
children: [
{
name: "Person 1",
filterType: '_eventAttenddeeName',
parent: 'Event Attendee'
},
{
name: "Person 2",
filterType: '_eventAttenddeeName',
parent: 'Event Attendee'
}
]
}
]
}]
};
var TheOtherCollection = {
children: [
{
name: "A New Event",
children: [
{
name: "The Other Date",
parent: " A New Event",
children: [
{
name: "2010",
FilterType: '_eventStartDate',
Parent: '_event'
},
{
name: "2011",
FilterType: '_eventStartDate',
Parent: '_event'
}
]
}
]
}]
};
Questo genera una vista ad albero con le caselle di controllo utilizzando la seguente direttiva e html
app.directive('tree', function() {
return {
restrict: 'E',
replace: true,
scope: {
t: '=src',
filter: '&'
},
controller: 'treeController',
template: '<ul><branch ng-repeat="c in t.children track by $index" src="c" filter="doSomething(object, isSelected)"></branch></ul>'
};
});
app.directive('branch', function($compile) {
return {
restrict: 'E',
replace: true,
scope: {
b: '=src',
filter: '&',
checked: '=ngModel'
},
template: '<li><input type="checkbox" ng-click="innerCall()" ng-model="b.$$hashKey" ng-change="stateChanged(b.$$hashKey)" ng-hide="visible" /><a>{{ b.name }}</a></li>',
link: function (scope, element, attrs) {
var clicked = '';
var hasChildren = angular.isArray(scope.b.children);
scope.visible = hasChildren;
if (hasChildren) {
element.append('<tree src="b"></tree>');
$compile(element.contents())(scope);
}
element.on('click', function(event) {
event.stopPropagation();
if (hasChildren) {
element.toggleClass('collapsed');
}
});
scope.stateChanged = function(b) {
clicked = b;
};
scope.innerCall = function() {
scope.filter({ object: scope.b, isSelected: clicked });
};
}
};
});
E poi l'html
<div ng-controller="treeController">
<tree src="myList" iobj="object" filter="doSomething(object, isSelected)"></tree>
<a ng-click="clicked()"> link</a>
</div>
Quando un viene selezionata la casella di controllo la nuova raccolta viene aggiunta a quella esistente utilizzando loda shjs
ng-click evento
$scope.doSomething = function (object, isSelected) {
if (isSelected) {
var item = object;
console.log(item);
nestAssociation(object, $scope.myList, TheOtherCollection);
}
}
che crea il nuovo array e lo aggiunge all'interno dell'array bambini
function nestAssociation(node, oldCollection, newAggregates) {
// var item = fn(oldCollection, node.parent);
var updatedArray = _.concat(oldCollection.children, newAggregates);
console.log(updatedArray);
if (updatedArray != null)
updateMyList(updatedArray);
}
posso vedere nell'output ho un nuovo oggetto ma non posso' t ottenere la vista ad albero per aggiornare. Ho provato all'interno della direttiva di aggiungere un $ compile (elemento) all'evento click nella direttiva, ma poiché l'array non è stato creato, non cambia nulla.
Devo aggiungere un $ watch a questa direttiva e, in caso affermativo, dove o c'è un altro modo in cui posso ottenere la direttiva per ri-renderizzare e visualizzare la nuova raccolta nidificata?
Aggiornamento
Base su alcuni dei commenti e domande qui è un po 'più in dettaglio intorno alla questione. Il problema che sto vedendo non è nella direttiva per quanto riguarda lo spostamento dei dati attorno al problema è che non riesco a ri-renderizzare il treeview una volta aggiunto un array al modello esistente. Il seguente collegamento is a working plunker che mostra il progetto mentre attualmente funziona. corso strumenti di Chrome dev posso vedere in uscita il modello viene aggiornato dopo una casella di controllo è selezionata
Mentre vedo l'oggetto viene aggiornato, la direttiva non aggiorna per mostrare il nuovo array aggiunto all'oggetto. Questa è la parte che ho bisogno di aiuto per capire.
grazie in anticipo
Sarebbe bello se poteste creare un plunkr o una codepen in cui potessimo vedere il problema reale e lavorare nel vostro codice (come ho capito, la codepen collegata era solo il vostro punto di partenza). –
Puoi pubblicare il codice della tua funzione 'updateMyList' che è chiamata da' nestAssociation() '. Immagino che questo sia dove effettivamente salvi l'array aggiornato in '$ scope.myList' –
Ho aggiornato la mia domanda con un link plunker – rlcrews