2015-04-30 37 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

的感謝!