【发布时间】:2014-01-24 20:31:26
【问题描述】:
我已经能够正确地将一个对象与来自服务的原始数据绑定到来自控制器的范围变量,但我在使用来自服务的数组变量做同样的事情时遇到了麻烦。
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>
我有一个登录函数,它在成功传递 userId 时调用 initMySets,我知道服务中的 mySets 变量已在角度副本上正确填充,但我没有在控制器中获得实际更新。
$scope.user 变量正在从 UserService 更新,但 mySet ng-repeat 未显示来自服务的列表。
从 http.get 返回的数据是来自我的 MVC Web API 控制器的复杂对象的 IEnumerable 集合。我不确定这是否会有所不同。
【问题讨论】:
-
看看
$apply()方法:docs.angularjs.org/api/ng.$rootScope.Scope -
@Cherniv 而
$apply确实强制更新并且可能对某些人有用,服务本身没有作用域并且在$rootScope上调用此方法可能很昂贵。
标签: javascript angularjs asp.net-web-api angularjs-scope angularjs-service