Ho un oggetto che rappresenta un ordine da ristorante:
function order () {
this.customer_name = ""
this.menu = // menu object
}
esteso con alcuni metodi oggetto per la logica aziendale, come:
order.prototype.value = function() {
var total = 0;
for (var i = 0; i < this.menu.length; i++) {
// calculate the order value
}
return total;
}
Negli ordini del controller angolare vengono inviati a un array quando vengono inviati (tramite ng-clic da un pulsante nella vista):
var ref = new Firebase("https://myfirebase.firebaseio.com");
$scope.orders = [];
angularFire(ref, $scope, "orders");
$scope.currentOrder = orderService;
$scope.submitOrder = function() {
$scope.orders.push($scope.currentOrder);
};
Una volta che gli ordini vengono inseriti nell'array, proprietà come orders[0].customer_name
lavoro, ma metodi come orders[0].value()
don "t.
Sembra ragionevole che Firebase / Angularfire possa solo sincronizzare JSON, ma esiste un approccio che mi consenta di mantenere la logica relativa agli ordini inclusa con order
oggetto, cioè senza dover scrivere $scope.getOrderValue(orders[0])
?
risposte:
1 per risposta № 1Non c'è un ottimo modo per fare esattamente quello che vuoi, poiché secondo il Domande frequenti su Firebase:
A livello basso, supportiamo fondamentalmente gli stessi tipi di dati di JSON: stringhe, numeri, booleani e oggetti (che a loro volta contengono stringhe, numeri, booleani e altri oggetti).
Ciò significa che è possibile memorizzare i dati ma non le funzioni. Sembra che un modo pulito per ottenere lo stesso risultato sia archiviare l'ultimo valore dell'ordine come proprietà del tuo order
oggetto, e avere un metodo come parte del tuo orderService
che lo aggiorna ogni volta che vengono aggiunte o rimosse voci di menu. In alternativa, fai ciò che hai suggerito e hai un getOrderValue
da qualche parte, ma probabilmente ha ancora senso metterlo in un servizio.
0 per risposta № 2
In realtà ho avuto lo stesso problema. Volevo aggiungere un metodo al mio oggetto firebase. Dopo aver consultato gli ultimi documenti di angularfire, ho scoperto che $ extend può fare proprio questo Non l'ho ancora testato, ma penso che questo sia il modo per farlo.