2015-04-30 38 views
0

我以前的工作Sharepoint服务停止工作 - 我不知道为什么,它只是停了下来。AngularJS SharePoint - 回拨地狱停止工作

在我的控制器

我所说的服务功能,应该返回一些数据,我可以把我的范围变量:

var getItemsFromSPService = function() { 
    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function() { 
     SPService.loadItems($scope.gridParams).then(function (result) { 
      //result.items is always undefined!? 
      $scope.gridParams.data = result.items; 
      $scope.gridParams.itemsCount = result.itemsCount; 
     }); 
    }); 
}; 

这里是我的服务 - 即工作,直到昨天:/

angular.module('app').service('SPService', ['$q', function ($q) { 

var service = this; 

service.currentUser = { 
    id: null, 
    login: null, 
    fullLogin: null, 
    roles: [] 
} 

service.gridParams = {}; 

service.loadItems = function (gridParams) { 

    service.gridParams = gridParams; 
    //don't load SP user twice... 
    if (service.currentUser.id != null) {    
     return loadListData(); 
    } 
    else {    
     return loadCurrentUser().then(function() { 
      return loadListData(); 
     }) 
    }   
}; 


//get current SP user and save to service.currentUser 
var loadCurrentUser = function() { 

    var deferred = $q.defer(); 

    var clientContext = new SP.ClientContext.get_current(); 
    var web = clientContext.get_web(); 
    clientContext.load(web); 

    var currentSPUser = web.get_currentUser(); 
    clientContext.load(currentSPUser); 

    clientContext.executeQueryAsync(
    function() { 
     service.currentUser.id = currentSPUser.get_id(); 
     service.currentUser.fullLogin = currentSPUser.get_loginName(); 
     service.currentUser.login = service.currentUser.fullLogin; 
     if (service.currentUser.login.indexOf("\\") > -1) 
      service.currentUser.login = service.currentUser.login.slice(service.currentUser.login.indexOf("\\") + 1, service.currentUser.login.length) 

     deferred.resolve(service.currentUser); 

    }, function() { 
     alert('Fehler beim Laden des Users aus dem SharePoint') 
    }) 

    return deferred.promise; 
} 

var loadListData = function() { 
    var deferred = $q.defer(); 

    var result = { 
     items: [], 
     itemsCount: null 
    } 

    //RowCount 
    getQueryRowCount().then(function (rowCount) { 

     result.itemsCount = rowCount; 

     var clientContext = new SP.ClientContext.get_current(); 
     var web = clientContext.get_web(); 
     clientContext.load(web); 
     var list = web.get_lists().getByTitle(service.gridParams.listName); 
     clientContext.load(list); 

     var query = new SP.CamlQuery(); 
     var queryString = (buildQueryString(false)); 
     query.set_viewXml(queryString); 

     var listItems = list.getItems(query); 
     clientContext.load(listItems);   

     clientContext.executeQueryAsync(
     function() { 
      //success 
      var resultItems = []; 
      var listItemEnumerator = listItems.getEnumerator(); 
      while (listItemEnumerator.moveNext()) { 

       var listItem = listItemEnumerator.get_current(); 
       var listItemId = listItem.get_id().toString(); 

       //get specific item including EffectiveBasePermissions, after that, copy and push to result array 
       getListItem(listItemId).then(function (returnedItem) { 
        var newItem = {}; 
        angular.forEach(service.gridParams.columns, function (col) { 

         if (col == "Author") 
          newItem[col] = returnedItem.get_item(col).get_lookupValue(); 
         else 
          newItem[col] = returnedItem.get_item(col);        
        }) 
        newItem['WriteAccess'] = returnedItem.get_effectiveBasePermissions().has(SP.PermissionKind.editListItems); 
        result.items.push(newItem); 

        //result.items is there!!!! it holds the SP data 
       }); 
      } 

      deferred.resolve(result.items); //result.items is emtpty in debugger!? 

     }, function() { 
      //fail 
      alert('Fehler beim Laden der SharePoint Liste.'); 
     }); 
    }); 

    return deferred.promise; 
} 

var getQueryRowCount = function() { 
    var deferred = $q.defer(); 

    var clientContext = new SP.ClientContext.get_current(); 
    var web = clientContext.get_web(); 
    clientContext.load(web); 
    var list = web.get_lists().getByTitle(service.gridParams.listName); 
    clientContext.load(list); 

    var query = new SP.CamlQuery(); 
    var queryString = (buildQueryString(service.gridParams, true)); 
    query.set_viewXml(queryString); 
    var listItems = list.getItems(query); 
    clientContext.load(listItems); 

    clientContext.executeQueryAsync(
     function() { 
      //success 
      deferred.resolve(listItems.get_count()); 
     }, 
     function (sender, args) { 
      //fail 
      alert('Fehler beim Laden der Element-Anzahl.'); 
     }); 
    return deferred.promise; 
} 

var getListItem = function (listItem_id) { 
    var deferred = $q.defer(); 

    var clientContext = new SP.ClientContext.get_current(); 
    var list = clientContext.get_web().get_lists().getByTitle(service.gridParams.listName); 
    var listItem = list.getItemById(listItem_id); 
    clientContext.load(listItem); 
    clientContext.load(listItem, 'EffectiveBasePermissions'); 
    clientContext.executeQueryAsync(
     function() { 
      //success 
      deferred.resolve(listItem); 
     }, 
     function (sender, args) { 
      //fail 
      alert('Fehler beim Laden der Element-Berechtigungen.'); 
     }); 
    return deferred.promise; 
} 

//other crud functions. saving works e.g. - same $q logic 


}]); 

你看到任何不正确的东西吗?

btw。如果SP.SOD.execureFunc()将在服务中并且该服务将返回项目,我会更喜欢它。所以我可以在控制器中这样做:

SPService.loadItems($scope.gridParams) 

非常感谢!

+0

墙上的代码。你有什么试图调试你的服务? “btw”句子是什么? – Marco

+0

好吧对不起。请在承诺返回之前查看loadListData末尾的部分。你可以在评论中看到我调试的内容。 “before”deferred.resolve(result.items)result.items数组填充了数据。但该数据似乎没有被返回。调试器显示“未定义”。 – uNki

+0

“btw”句子:要使用sharepoint客户端对象模型,您必须加载sp.js.首先SP.SOD.executeFunc('sp.js','SP.ClientContext',回调)。但该函数不会从回调函数返回数据。至少我还没有找到办法。这就是我想要做的。 – uNki

回答

0

我发现了一个解决方案,但它很脏,我不明白为什么旧代码停止工作。

我把$ scope作为参数传递给我的主要服务函数。然后改变

var loadListData = function() { 
    var deferred = $q.defer(); 

    ... 
       result.items.push(newItem); 
      }); 
     } 

     deferred.resolve(result.items); //result.items is emtpty in debugger!? 

    }, function() { 
     //fail 
     alert('Fehler beim Laden der SharePoint Liste.'); 
    }); 
}); 

var loadListData = function() { 
    service.scope.gridParams.data = []; 

    ... 
       service.scope.gridParams.data.push(newItem); 
       service.scope.gridParams.itemsCount = result.itemsCount; 
      }); 
     } 

    }, function() { 
     //fail 
     alert('Fehler beim Laden der SharePoint Liste.'); 
    }); 
}); 

,看起来SO错..服务功能内操纵$范围。我甚至遗漏了主要的$ q推迟的东西在功能

我只是想返回值返回给函数调用者。我只是不知道为什么停止工作。

我真的很喜欢干净的最佳实践解决方案! :)

谢谢!

0

第二种可能的方法是将“deferred.resolve(..)”更改为“scope。$ apply(deferred.resolve(...))”。您也必须将$ scope或$ rootScope作为参数传递给服务函数。但是这看起来不如在服务函数中直接操作$ scope变量那么糟糕。

我不知道这是否是更好地使用$ rootScope,根据这个线索是: Nested promises not resolving until a button is clicked

的感谢!