Ho sviluppato alcune applicazioni prototipo in Angular, con vari backend, tra cui firebase e php / mysql. Sono abbastanza sicuro di non utilizzare un buon modello organizzativo per lo sviluppo a causa di un paio di klug che devo usare nel codice per evitare l'eccezione "iterazione massima raggiunta".
Ho un modello con una ng-repeat, come questa:
<ion-item data-ng-repeat="outcome in Outcomes.getAll()">...</ion-item>
È supportato da un servizio come questo:
'usa strict';
angular.module ('app.outcomes', ['app.utility']). servizio ('Risultati', funzione ($ http, Utility) { var svc = questo; svc.outcomes = false;
/**
* Initializes the outcomes array if it has not yet been initialized.
*
* @returns {Array}
*/
svc.initialize = function () {
if (svc.outcomes === false) {
// If this is not set to something immediately, repeated calls to
// digest occur during http call and digest overloads.
svc.outcomes = true;
$http.get('/api/outcome/all').
success(function (data, status, headers, config) {
svc.outcomes = data.result; // set data to real array value
}).
error(function (data, status, headers, config) {
});
}
};
/**
* Called in ng-repeat so that it makes sure the data is initialized.
* An ng-init call does not work.
* @returns {Array}
*/
svc.getAll = function () {
svc.initialize(); // called constantly from ng-repeat, while array actually set
return svc.outcomes;
};});
Il controller è un one-liner che imposta la variabile $ scope.Outcomes sul servizio.
Questa strategia funziona, perché il ciclo digest verifica la condizione. Quello che sembra klugy per me è che ho bisogno di impostare la matrice dei risultati su un valore inutilizzato mentre aspetto che la chiamata ajax torni. Altrimenti viene chiamato il ciclo del digest e tenta di continuare a farlo per quanto a lungo dura la chiamata per tornare dal server.
Un altro problema correlato che ho è che se imposto l'array svc.outcomes più tardi, a volte otterrò lo stesso errore su troppe iterazioni di digest.
Le domande che ho sono:
1) C'è un modo migliore per organizzare il codice? Devo poter accedere ai dati del server su più ambiti.
2) C'è un modo per garantire che l'array di dati venga inizializzato senza dover chiamare il metodo getAll () nel ciclo ng-repeat? Una chiamata ng-init non compila i dati, quindi non posso semplicemente riferire Outcomes.outcomes nel modello.
Ciò che è strano per me è che penso che la cosa delle "iterazioni massime" sia appena iniziata con l'uso di un aggiornamento minore (da 1.3.3 a 1.3.6) ad angolare. Potrebbe essere la mia immaginazione. Qualsiasi suggerimento architettonico sarebbe apprezzato.