GVKun编程网logo

angularjs – 使用角度和ADAL的Cordova应用程序(angularjs directive)

15

以上就是给各位分享angularjs–使用角度和ADAL的Cordova应用程序,其中也会对angularjsdirective进行解释,同时本文还将给你拓展ajax–使用AngularJS(多个独立

以上就是给各位分享angularjs – 使用角度和ADAL的Cordova应用程序,其中也会对angularjs directive进行解释,同时本文还将给你拓展ajax – 使用AngularJS(多个独立应用程序)的Portal类型应用程序、angularjs cordova base href、Angularjs localStorage存储cordova应用程序中的设置、angularjs – $scope的提供者!在角度2应用程序中使用角度1指令时出错等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

angularjs – 使用角度和ADAL的Cordova应用程序(angularjs directive)

angularjs – 使用角度和ADAL的Cordova应用程序(angularjs directive)

我正在使用Cordova构建我的第一个移动应用程序.后端服务存在于Azure上,因此我尝试使用Cordova的ADAL插件来进行身份验证.

首先,我发现该库不会像Angular的ADAL库那样进行拦截.我在我的Cordova应用程序中使用Angular,与外观的材料设计指令配对.拦截本来会很好,但据我所知,目前还不存在(应该知道实施的难度).

所以我现在写了一个服务,它将负责向Azure发送REST api请求,包括正确的身份验证令牌.它基于here的样本.

这就是我提出的:

var request = function(url)
{
    createContext()
        .then(function () {
            getAuthToken().then(
                function(token) {
                    sendRequest(token,url);
            })
        },function (err) {
            $log.error("Failed to create a context.");
        });
};

首先,它将创建身份验证上下文:

function createContext () {
    return $q(function (resolve,reject) {
        var authenticationContext = Microsoft.ADAL.AuthenticationContext;

        authenticationContext.createAsync(authority)
            .then(function (context) {
                authContext = context;
                $log.log("Created authentication context for authority URL: " + context.authority);
                resolve();
            },function (err) {
                $log.error("Failed to create authentication context: " + pre(err))
                reject();
            });
    });
};

使用上下文它应该获取身份验证令牌:

function getAuthToken()
{
    if (authContext == null) {
        $log.error('Authentication context isn\'t created yet. Create context first');
        return;
    }

    return $q(function (resolve,reject) {
        authContext.acquiretokenAsync(resourceUrl,appId,redirectUrl)
            .then(function (authResult) {
                resolve(authResult.accesstoken);
            },function (err) {
                $log.error("Failed to acquire token: " + pre(err));
                reject();
            });
    });
}

然后它应该发送请求,但我会留下那部分,因为它从来没有到达那里.我觉得有必要再次强调我对这个东西是完整的n00b,所以请对我很轻松,尤其是代码.可能还有很大的改进空间,我明白了.

当我实际运行它时,会弹出一个窗口,我需要使用我的Microsoft帐户登录,很酷.我第一次尝试这个时甚至得到了两个因素身份验证,非常好!所以我登录后回到代码中.但是现在authresult变量的状态为“Failed”,结果中没有访问令牌.不幸的是,也没有迹象表明出了什么问题.所以问题的第一部分是;什么可能出错?

现在我们来看问题的第二部分;你如何正确调试这些事情?在我的桌面上,我会运行fiddler检查通信,但我不知道如何为Android做这件事.我正在我的设备上调试btw,因为某些原因,我可用的所有模拟器都非常慢(VS和谷歌),即使我的硬件规格应该支持它们就好了.

感谢您的任何指示!

更新03-02-2016

稍稍摆弄代码,我决定在登录功能中打包,这样可以缩短一些样本:

var createContext = function () {
    if (authContext == null) {
        authContext = new Microsoft.ADAL.AuthenticationContext(authority);
    }
};

var getAuthToken = function () {
    if (authContext == null) {
        $log.error('Authentication context isn\'t created yet. Create context first');
        return;
    }

    return $q(function (resolve,reject) {
        authContext.acquiretokenAsync(endpointUrl,function (err) {
                $log.error("Failed to acquire token: " + pre(err));
                reject();
            });
    });
}

var login = function () {
    createContext();
    getAuthToken();
}

此代码在以下输入变量上运行:

var authority = 'https://login.windows.net/[tenantid]';
var resourceUrl = 'https://graph.windows.net/';
var appId = '1ef41b17-0943-4359-bc12-014f4fd2d841';
var redirectUrl = 'http://MyApp';

我现在使用chrome:// inspect来查看电线上的内容.令我惊讶的是,我看到Azure返回了一个有效的SAML令牌.它已经有了我的名字和所有内容,我认为他们在认证失败后不会发送.所以看起来即使响应没问题,ADAL库也没有给我一个正确的响应(Status = Failed).再也不知道如何继续:S

我刚刚解决了就像人们所期望的那样,补救措施就像他们得到的一样简单.在Azure AD中配置应用程序,我选择了“Web应用程序”类型的应用程序,因为这是一个使用Angular和所有的Web应用程序.现在我想因为Cordova将事物翻译成本机代码,所以这不是正确的选择.一旦我创建了一个新的应用程序作为“本机应用程序”而使用了该应用程序的客户端ID,一切都开始工作了……真诚地希望这将有助于未来的其他人……!

ajax – 使用AngularJS(多个独立应用程序)的Portal类型应用程序

ajax – 使用AngularJS(多个独立应用程序)的Portal类型应用程序

我们正在尝试使用多个/独立的“子应用程序”创建门户类型应用程序.假设所有子应用程序都是用Angular编写的,那么实现以下目标的好模式是什么.

>每个应用程序都可以相互独立地开发和部署.
>他们共享一个通用的身份验证服务,他们可以共享公共库(指令,过滤器等).
>在任何给定时间,只有一个应用程序可见并处于活动状态.每个子应用程序的范围彼此隔离.
>当用户进入子应用程序之间时,只要用户不刷新页面或访问另一个静态链接,就会维持状态. (我认为这是内置于Angular中,可能不需要特别的努力)
>每个子应用程序将有多个视图(它将有自己的菜单).将根据可用的子应用程序提供顶级菜单.理想情况下,顶层菜单是根据部署的子应用程序动态构建的.也许有一个服务器端组件(服务器检测文件夹结构等,并确定部署了哪些应用程序,并将必要的js代码注入页面).

鉴于AngularJs没有多级视图结构,我考虑在不同的div上使用多个ng-app声明,然后使用$window scope存储活动应用程序的键并隐藏那些不活动的应用程序.

对你的(相当开放的)问题没有简单的答案,但关于$route和ngView限制,我使用从这里得到的技术取得了巨大的成功: http://www.bennadel.com/blog/2420-Mapping-AngularJS-Routes-Onto-URL-Parameters-And-Client-Side-Events.htm

angularjs cordova base href

angularjs cordova base href

试图为 angularjs html5网络应用程序设置正确的基本href值以在cordova中工作

最初使用$locationProvider.html5Mode(true)和< base href =“/”>:

> app在普通浏览器中完美运行
> cordova为css / js / templates等提供资源错误
(我相信它在cordova根目录中寻找资源而不是平台根目录?)

在SO和ui-router FAQs上尝试了一些替代方案:

< base href =“.”>使用html5模式,根据this答案:

>资产在cordova中找到了(没有资源错误)
> ui-router进入带有无限循环的尾部旋转和以下错误消息
错误:无法在“历史记录”上执行“pushState”:无法在具有源https://example.com的文档中创建URL为“https:// page /”的历史状态对象

< base href =“./”>使用html5模式:

>在cordova中找到的资产(没有资源错误)
>给了我可怕的错误:达到10 $digest()迭代.中止!信息
尝试使用frankwallis solution提到的here,但没有帮助(相同的错误)

$locationProvider.html5Mode没有基础href({enabled:true,requireBase:false});

>在cordova中找到的资产(没有资源错误)
>页面开始加载自己? …在某些州有两次角度引导?

我的app配置定义如下:

myApp.config(['$locationProvider','$urlRouterProvider','$stateProvider','$stickyStateProvider',function($locationProvider,$urlRouterProvider,$stateProvider,$stickyStateProvider) {

    $locationProvider.html5Mode(true);

    $stateProvider
    .state('root',{            // we define a 'root' state so that we can load some essential data prior to any template being loaded
        url: '',abstract: true,sticky: true,views: {
            'root': {
                template: '<ui-view/>',}
        }
    })
    .state('root.worldmap',{
        url : '/worldmap',templateUrl : 'templates/worldmap.tmpl.html'
    })
    .state('root.faq',{
        url : '/faq',templateUrl : 'templates/faq.tmpl.html'
    })
    .state("otherwise",{
        url: "*path",views: {
            'root': {
                template: "",controller: ['$injector',function($injector) {
                    var $state = $injector.get("$state");
                    $state.go('root.worldmap');
                }]
            }
        },});
    $stickyStateProvider.enableDebug(true);
}]);

有关信息:
使用this method替代cordova deviceready和angular.element bootstrap分别为cordova /浏览器

好的,这样做的方法是删除基本href并禁用html5模式:

> [可选]创建&结帐一个名为dev-cordova或类似的新分支

>这允许您在浏览器和设备代码之间快速切换

>删除/评论< base href =“/”>在主index.html
>确保在app.js中禁用html5模式

$locationProvider.html5Mode({
    enabled: false,requireBase: false
});

要么

$locationProvider.html5Mode(false);

不要忘记运行cordova build ios(在你grunt / gulp等之后编译js文件)…这可确保更新cordova / platforms / ios / www目录中的文件.

Angularjs localStorage存储cordova应用程序中的设置

Angularjs localStorage存储cordova应用程序中的设置

我正在使用AngularJS v1.2.7和Cordova 3.3.0( Android)我需要在手机内存中存储一​​些设置 – 所以当应用程序/设备重新启动时,应用程序仍然可以访问这些存储的数据.

关于这个的任何教程?我找不到任何:(

知道Cordova支持; LocalStorage,Websql(no more maintained),IndexedDB(Opera和Safari的not widely supported).我倾向于使用LocalStorage,但是即使在我重启设备后它仍保留/记住数据?

目前我正在使用答案#12969480 by Richard Szalay.

我建议编写一个自定义插件,并在Objective-C用户默认值中正确存储设置.

LocalStorage不是永久存储,而Websql似乎对存储设置有点过分.

您不必过多参与Objective-C并且有很好的Phonegap / Cordova插件指南:

http://docs.phonegap.com/en/3.3.0/guide_hybrid_plugins_index.md.html#Plugin%20Development%20Guide

我使用此代码存储“FirstRun”变量来检查应用程序是否是新安装.插件检查应用程序之前是否已运行,并返回1或0,将其解析为整数并计算为true / false.

您可以更新此代码并向“AppChecks”类添加更多方法.我把所有简单的检查和设置存储放在这个类中.

AppChecks.h

#import <Cordova/CDVPlugin.h>

@interface AppChecks : CDVPlugin

- (void) checkFirstRun:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;

@end

AppChecks.m

#import "AppChecks.h"
#import <Cordova/CDVPluginResult.h>

@implementation AppChecks

- (void) checkFirstRun:(NSMutableArray *)arguments withDict:(NSMutableDictionary *)options {
Nsstring* callbackId = [arguments objectAtIndex:0];

CDVPluginResult* pluginResult = nil;
Nsstring* javaScript = nil;

@try {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    Nsstring *isFirstRun = @"1";

    if (![defaults objectForKey:@"firstRun"]) {
        [defaults setobject:[NSDate date] forKey:@"firstRun"];
    } else {
        isFirstRun = @"0";
    }

    pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsstring:isFirstRun];
    javaScript = [pluginResult toSuccessCallbackString:callbackId];
} @catch (NSException* exception) {
    // Could not get locale
    pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_JSON_EXCEPTION messageAsstring:[exception reason]];
    javaScript = [pluginResult toErrorCallbackString:callbackId];
}
[self writeJavascript:javaScript];
}
@end

在我的Javascript代码中使用:

cordova.exec(
    function( isFirstRun ) {
        isFirstRun = parseInt( isFirstRun );
        if( isFirstRun ) {
          // do stuff for first run
        }
    },function(err) {
        // handle error from plugin
    },"AppChecks","checkFirstRun",[]
);

angularjs – $scope的提供者!在角度2应用程序中使用角度1指令时出错

angularjs – $scope的提供者!在角度2应用程序中使用角度1指令时出错

我有一个使用angular-cli构建的角度2应用程序,我需要在我的一个组件中使用角度1指令(从不同的应用程序重用它).我按照以下步骤操作:

https://angular.io/docs/ts/latest/guide/upgrade.html#!#using-angular-1-component-directives-from-angular-2-code

但现在我遇到了这个错误,无法超越它.我正在使用angular2.0.2(我设法在过去使用beta版本构建了一个混合应用程序,但它是一个angular1应用程序,我使用角度2组件与适配器的降级功能).

在我的app.module.ts中我有:

import { UpgradeAdapter } from '@angular/upgrade';
const upgradeAdapter = new UpgradeAdapter(forwardRef(() => AppModule));

const HeroDetail = upgradeAdapter.upgradeNg1Component('heroDetail');

@NgModule({
    imports:      [
        browserModule,...
    ],declarations: [
      ...       
     HeroDetail
     ]
})
export class AppModule { }

我的hero-detail.component.ts看起来像这样:

export const heroDetail = {
  templateUrl: 'hero-detail.html',controller: function() {
  }
};

而我的hero-detail.html看起来像这样:

<h2>Windstorm details!</h2>

我只是通过添加模板尝试在另一个角度2组件中使用该指令:

当我运行服务时,应用程序编译正常,但当我尝试加载页面时,我得到上述错误.

关于如何向前推进的任何建议?

解决方法

看来你的引导逻辑不正确.

它实际上不是很明显,请确保:

>你不用@NgModule({bootstrap:[…]})引导任何ng2组件.相反,您应该在主模块中使用空的ngdobootstrap(){}方法.
>根模板是ng1模板.即在index.html中,您应该只有ng1组件或降级的ng2组件.您可以将ng2组件作为根,但是您需要先将其降级.

官方升级指南包含DOM结构的示例:

enter image description here

…确保ng2注射器具有ng1所需的所有提供者.

关于angularjs – 使用角度和ADAL的Cordova应用程序angularjs directive的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于ajax – 使用AngularJS(多个独立应用程序)的Portal类型应用程序、angularjs cordova base href、Angularjs localStorage存储cordova应用程序中的设置、angularjs – $scope的提供者!在角度2应用程序中使用角度1指令时出错等相关内容,可以在本站寻找。

本文标签: