Ich versuche, meinen Kopf um Fabriken und Dienstleistungen in AngularJS zu wickeln und bleibe stecken. Hier ist ein grundlegendes Beispiel ähnlich zu Problemen, die ich versuche zu lösen.Zählen von Daten innerhalb von Kind-Controllern in Angular JS
HTML
<div ng-controller="productGridController">
<div ng-repeat="category in categories" ng-controller="productCategoryController">
<input type="text" ng-model="category.name">
<div ng-repeat="product in products">
<input type="text" ng-model="product.name">
</div>
<a class="btn btn-small" ng-click="addProduct()">Add Product</a>
</div>
<a class="btn" ng-click="addCategory()">Add Category</a>
</div>
Lassen Sie uns jetzt sagen, dass ich eine Gesamtzahl aller Produkte erhalten möchten, die derzeit innerhalb des Root-Controller instanziiert productGridController
und speichern sie in einer Variablen kann ich Ausgang innerhalb des productGridController
in ein Variable wie $scope.totalProducts
Da jeder productCategoryController
hat seinen eigenen Umfang, ich bin mir nicht sicher, wie man globale Zähler und Summen so macht? Ich denke, ia Service oder Fabrik könnte so etwas tun, aber ich bin nicht sicher, wie man es einführt.
Ich habe versucht, einen Stammbereich Variable in der productGridController
wie folgt setzen:
app.controller("productGridController", function($scope, $http, $rootScope, $timeout) {
$scope.totalProducts = 0;
$scope.categories = [];
$scope.addCategory = function() {
$scope.categories.push({name:''});
}
});
Und dann beobachten, wenn etwas in der Dies funktioniert
app.controller("productCategoryController", function($scope, $http, $rootScope, $timeout) {
$scope.products = [];
$scope.addProduct = function() {
$scope.products.push({name:''});
}
$scope.$watch('products', function() {
$scope.totalProducts = $scope.products.length;
}, true);
});
productCategoryController
geändert, wenn es gibt nur eine Kategorie hinzugefügt, aber wenn es mehrere Kategorien gibt, berücksichtigt nur die letzte.
Denken Sie auch daran, dass ich in meiner realen Anwendung die Daten aus einer Datenbank einlese, damit diese auch in Echtzeit arbeiten können, so dass die Zählerfunktion an jedem beliebigen Punkt aufgerufen werden kann, um den aktuellen Status anzuzeigen wie viele Produkte es derzeit gibt.
Was wäre der einfachste Weg, dies in Angular JS zu tun?
* Was wäre der einfachste Weg, dies in Angular JS zu tun? * Ich denke, Sie machen das Leben kompliziert, indem Sie einen Controller für jedes Element in einer 'ng-Wiederholung' instanziieren. Im Allgemeinen sollte ein Controller nicht versuchen, zu viel zu tun. Es sollte nur die Geschäftslogik enthalten, die für eine einzelne Ansicht benötigt wird. Weitere Informationen finden Sie in [AngularJS Developer Guide - Korrekte Verwendung von Controllern] (https://docs.angularjs.org/guide/controller#using-controllers-correctly). – georgeawg