AngularJS-Dienst Binden array-variable auf den controller-scope
War ich in der Lage, richtig zu binden ein Objekt primitiven Daten von einem Dienst zu einer scope-variable aus einem controller, aber ich habe Probleme, das gleiche zu tun, mit einer array-Variablen aus dem Dienst.
service.js
myServices.factory('MyService', ['$http', function($http) {
var mySets = [];
return {
initMySets: function(userId, success, error) {
$http.get(apiUrl + "/controller/getmysets", {params:{id:userId}}).success(function (data) {
mySets = [];
angular.copy(data, mySets);
}).error(error);
},
getMySets: mySets
}]);
controllers.js
myControllers.controller('MenuController', ['$scope', 'UserService', 'MyService',
function ($scope, UserService, MyService) {
$scope.user = UserService.user;
$scope.mySets = MyService.getMySets;
$scope.logout = function() {
UserService.logout();
}
}]);
index.html
<nav id="app-menu" ng-controller="MenuController" ng-class="{hide:!global.showMenu,slide:global.showMenu}">
<div id="menu-head">
<h4>{{user.Email}}</h4>
</div>
<ul>
<div ng-switch on="user.UserId != null">
<li ng-switch-when="true"><a href="#/main" ng-click="toggleMenu();logout();">Logout</a></li>
<li ng-switch-when="false"><a href="#/login" ng-click="toggleMenu()">Login</a></li>
<li ng-switch-when="true" ng-repeat="mySet in mySets">
<a href="#/mySet /{{mySet.MySetId}}" ng-click="toggleMenu()">{{mySet.Label}}</a>
</li>
</div>
</ul>
</nav>
Habe ich eine login-Funktion, die Anrufe initMySets auf Erfolg vorbei in die userId und ich weiß, dass die mySets variable in der service immer ordnungsgemäß ausgefüllt an den eckigen kopieren, aber ich bin nicht immer das aktuelle update in den controller.
Den $scope.user-variable aktualisiert wird von den UserService, aber die mySet ng-repeat ist nicht die Anzeige der Liste aus dem Dienst.
Die Daten, die zurückgegeben werden aus der http.zu bekommen ist die eine IEnumerable-Auflistung von komplexen Objekten von meinem MVC-Web-API-controller. Ich bin mir nicht sicher, ob das einen Unterschied macht.
- Werfen Sie einen Blick auf
$apply()
Methode: docs.angularjs.org/api/ng.$rootScope.Umfang - während
$apply
erzwingt ein update und kann hilfreich sein, für einige Dienstleistungen, die sich nicht über Bereiche und ruft diese Methode auf die$rootScope
teuer werden kann.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bindung funktioniert nicht, weil das array (in dem controller) ändern sich nie.
Wenn Ihr initSets Erfolg-Funktion aufgerufen wird, wird der interne array-Punkte auf einen neuen array, sondern Ihr Umfang variable noch Punkte, um Ihre leeren ersten array.
Anstelle von erstellen eines neuen array-klar, Ihr erste-array und drücken Sie neue Elemente zu den ursprünglichen array:
Ersetzen:
Durch, dass:
Sehen diese Geige (ich simulieren, wird ein asynchroner Rückruf mit $timeout) : http://jsfiddle.net/UJTPD
Anstelle der Zuweisung einer neuen Liste (
mySets = []
) und rufen dannangular.copy
sind, sollten Sie einfach anrufenangular.copy
;Wie diese;