我正在尝试使用Angular中的WindowsAzure.MobileServiceClient进行单点登录和CRUD操作。作为一个Angular noob,我正在努力找出最好的方法:
我尝试过使用上面的一些方法,但我遇到了一些问题:
我能做些什么来让这项工作顺利进行?我可以在某个地方跟随的任何例子?文档似乎很粗略。
我正在使用Yeoman和角度生成器以及Grunt来完成我的工作,如果它有所不同。
答案 0 :(得分:8)
我能够弄清楚。我创建了一个新服务来处理所有的移动服务代码。由于来自客户端的方法是异步的,我在方法中使用回调。我还使用cookie存储来保存用户的凭证对象(currentUser),并在需要时再将其拉出。 currentUser似乎在调用之间丢失了用户凭证对象,因此我将其存储在cookie中并在丢失时将其推送到客户端。
'use strict';
angular.module('{appName}')
.factory('AzureMobileClient', ['$cookieStore', function ($cookieStore) {
var azureMobileClient = {};
azureMobileClient.isLoggedIn = false;
azureMobileClient.azureError = "";
azureMobileClient.azureMSC = new WindowsAzure.MobileServiceClient('{app URL from Azure}', '{app key from Azure}');
azureMobileClient.login = function(callback, socialMediaService) {
azureMobileClient.azureMSC.login(socialMediaService).then(function(user) {
azureMobileClient.isLoggedIn = user != null;
$cookieStore.put("azureUser", user);
callback(azureMobileClient.isLoggedIn);
}
, function(error){
alert(error);
azureMobileClient.azureError = error;
});
};
azureMobileClient.logout = function() {
azureMobileClient.getUser();
azureMobileClient.azureMSC.logout();
$cookieStore.remove("azureUser");
};
azureMobileClient.getStuff = function(callback) {
azureMobileClient.getUser();
var stuffTable = azureMobileClient.azureMSC.getTable("stuff");
stuffTable.read().then(function(items) {
callback(items);
});
};
azureMobileClient.addStuff = function(scope) {
azureMobileClient.getUser();
var stuffTable = azureMobileClient.azureMSC.getTable("stuff");
stuffTable.insert({ stuffname: scope.stuffname });
};
azureMobileClient.getUser = function() {
if (azureMobileClient.azureMSC.currentUser === null)
{
azureMobileClient.azureMSC.currentUser = $cookieStore.get("azureUser");
}
};
return azureMobileClient;
}]);
在执行登录和注销的控制器中,我这样做:
'use strict';
angular.module('{appName}')
.controller('MainCtrl', function ($scope, $window, AzureMobileClient) {
$scope.authenticate = function (socialService) {
AzureMobileClient.login(function(isLoggedIn) {
if (isLoggedIn)
{
$window.location.href = "/#/play";
}
}, socialService);
};
$scope.signOut = function() {
AzureMobileClient.logout();
}
});
登录/注销控制器的视图如下所示:
<button ng-click="signOut()">Sign Out</button>
<div class="span4">
<img src="images/facebooklogin.png" ng-click="authenticate('Facebook')" />
<img src="images/twitterlogin.png" ng-click="authenticate('Twitter')" />
<img src="images/googlelogin.png" ng-click="authenticate('Google')" />
</div>
最后在一个获取数据的控制器中,我这样做:
'use strict';
angular.module('{appName}')
.controller('StuffCtrl', ['$scope', '$window', 'AzureMobileClient', function ($scope, $window, AzureMobileClient) {
AzureMobileClient.getStuff(function(items) {
if (items.length == 0)
{
$window.location.href = "/#/stuff/new";
}
else
{
$scope.$apply($scope.items = items);
}
});
}]);
答案 1 :(得分:1)
仅适用于搜索即用型解决方案的人https://github.com/TerryMooreII/angular-azure-mobile-service
这是angularjs服务,它实现了以下方法:
只需在依赖关系列表中添加'azure-mobile-service.module'并配置api密钥:
angular.module('your-module-name').constant('AzureMobileServiceClient', {
API_URL : 'https://<your-api-url>.azure-mobile.net/',
API_KEY : '<your-api-key>',
});
然后:
angular.module.('your-module-name').controller('MainController', function ($scope, Azureservice) {
$scope.loginAction = function () {
Azureservice.login('facebook').then(function () {
console.log('login successful');
}).catch(function () {
console.log('login error');
}
}
}