1

我建立了这个工厂服务:

spApp.factory('siteCollection', function(){
  return {
    usersObject : [],
    getUsers : function (){
      $().SPServices({
        operation: "GetUserCollectionFromSite",
        completefunc: function(xData, Status) {
          var responseXML = $(xData.responseXML);
          responseXML.find("User").each(function() {
            usersObject.push({
              id: $(this).attr("ID"),
              name: $(this).attr("Name"),
              domainAccount: $(this).attr("LoginName")
            });
          });
        }
      });
      return usersObject;
    }
  }
})

假设返回我在顶部声明的 usersObject 但控制台给了我一个未定义的对象错误。

这是控制器:

spApp.controller('userCtrl', 
    function userCtrl($scope,siteCollection){
        $scope.users = siteCollection.getUsers();
    }
);

我对 Angular 很陌生。

4

2 回答 2

3

您的代码有两个问题:

第一个:您的工厂返回一个具有属性 usersObject 和 getUsers 的对象,但在 getUsers 中您尝试访问变量“usersObject”(这不是返回对象的属性)。您必须在外部声明变量:

var usersObject = [];
return {
  getUsers: function () {
    // ...
    return usersObject;
  }
};

第二个:你将你的 usersObject 填充到一个异步调用的回调函数中。AngularJS 不会在您的数组中注册更改。您可以使用 $rootScope.$apply(),然后 AngularJS 将运行摘要并在新数据添加到数组后更新视图。

spApp.factory('siteCollection', function ($rootScope) {
  // ...
  $rootScope.$apply(function () {
    responseXML.find("User").each( function () { ... } );
  });
}

使用 $rootScope.$apply() 不是很干净。更好的方法是返回一个承诺:

spApp.factory('siteCollection', function ($q) {
  return {
    getUsers : function (){
      var deferred = $q.defer();

      $().SPServices({
        operation: "GetUserCollectionFromSite",
        completefunc: function(xData, Status) {
          var responseXML = $(xData.responseXML),
              usersObject = [];

          responseXML.find("User").each(function() {
            usersObject.push({
              id: $(this).attr("ID"),
              name: $(this).attr("Name"),
              domainAccount: $(this).attr("LoginName")
            });
          });

          deferred.resolve(usersObject);
        }
      });

      return deferred;
    }
  }
});

如果您决定使用 Promise,请将其添加到您的控制器中,以便在加载数据后执行某些操作:

siteCollection.getUsers.then(function (users) {
  // ...
});
于 2014-01-18T03:24:17.697 回答
0

它应该看起来像这样

spApp.factory('siteCollection', function(){
  var usersObject = [];
  return {
    getUsers : function (){...

您的 return 是访问数据的方法的对象,但它们在范围上无关。所以如果只在返回对象中定义usersObject,在getUsers中是无法访问的。

于 2014-01-18T02:38:35.147 回答