Android Can';t将路由器与Nativescript的facebook登录插件一起使用

Android Can';t将路由器与Nativescript的facebook登录插件一起使用,android,angular,nativescript,Android,Angular,Nativescript,我创建的导入FB登录插件的组件(登录部分工作正常): 您可以在FacebookLoginHandler.registerCallback方法的末尾看到。我注册了登录成功时调用的fblogin服务,该服务存储在fblogin.service.ts中,如下所示 import {Injectable} from "@angular/core"; import {Router} from "@angular/router-deprecated"; @Injectable() export class

我创建的导入FB登录插件的组件(登录部分工作正常):

您可以在FacebookLoginHandler.registerCallback方法的末尾看到。我注册了登录成功时调用的fblogin服务,该服务存储在fblogin.service.ts中,如下所示

import {Injectable} from "@angular/core";
import {Router} from "@angular/router-deprecated";

@Injectable()
export class FbloginService {
    constructor(private _router: Router){
    }

successCallback(result) {
    var token;
    token = result.getAccessToken().getToken();
    console.log(token);
    this._router.navigate(['Home']);
};
该服务在成功时运行,但只在控制台上记录结果。当涉及到使用路由器服务更改页面时,尽管注入了构造函数,但它无法识别它的存在,我假设这是因为当作为registerCallback方法内的参数发送时,服务不是作为服务运行的

这是返回的错误

java.lang.RuntimeException:传递结果ResultInfo{who=null,request=64206,result=-1,data=Intent{(has)失败 附加)}}}到活动 {org.nativescript.map2/com.tns.nativescript活动}: com.tns.NativeScriptException:在ActivityResult上调用js方法 失败

TypeError:无法读取未定义文件的属性“\u router”: “/data/data/org.nativescript.map2/files/app/tns_modules/nativescript-facebook-login/facebook-handler.js, 行:45,列:29

StackTrace:Frame:function:'FbloginService.successCallback', 文件:'/data/data/org.nativescript.map2/files/app/services/fblogin.service.js', 行:13,列:13帧: 函数:'loginManager.registerCallback.com.facebook.FacebookCallback.onSuccess', 文件:'/data/data/org.nativescript.map2/files/app/tns_modules/nativescript facebook login/facebook handler.js', 行:35,列:17帧:函数:“act.onActivityResult”

有什么想法吗

编辑:

插件中regsitercallback方法内部的代码,我认为是旧的nativescript

export function registerCallback(successCallback: any, cancelCallback: any, failCallback: any) {

if(_isInit){
  var act = _AndroidApplication.foregroundActivity || _AndroidApplication.startActivity;
  _act = act; 

  loginManager.registerCallback(mCallbackManager, new com.facebook.FacebookCallback({

    onSuccess: function(result) {
      successCallback(result);
    },
    onCancel: function() {
      cancelCallback();

    },
    onError: function(e) {
      failCallback(e);
    }

  }));

  //Overriding Activity onActivityResult method to send it to the callbackManager
  act.onActivityResult = (requestCode: number, resultCode: number, data: android.content.Intent) => {
    mCallbackManager.onActivityResult(requestCode, resultCode, data);
  }
}
}而不是:

 FacebookLoginHandler.registerCallback(this._fbloginService.successCallback, 
 this._fbloginService.cancelCallback, this._fbloginService.failCallback);
您可以编写一个本地回调函数:

 FacebookLoginHandler.registerCallback(successCB,           
  this._fbloginService.cancelCallback, this._fbloginService.failCallback);

function successCB()
{
    _fbloginService.successCallback();
}
而不是:

 FacebookLoginHandler.registerCallback(this._fbloginService.successCallback, 
 this._fbloginService.cancelCallback, this._fbloginService.failCallback);
您可以编写一个本地回调函数:

 FacebookLoginHandler.registerCallback(successCB,           
  this._fbloginService.cancelCallback, this._fbloginService.failCallback);

function successCB()
{
    _fbloginService.successCallback();
}

您需要使用{N}运行时全局、
zonedCallback
,或使用
NgZone
。回调到{N}+ng2代码的第三方插件/服务需要通过区域运行。例如:

declare var zonedCallback: any;

@Component({
    selector: "login",
    providers: [FbloginService],
        templateUrl: "pages/login/login.html",
    })

export class LoginComponent {

constructor(private _fbloginService: FbloginService) {
}

facebookLogin(){
    FacebookLoginHandler.init();
    //Register our callbacks
    FacebookLoginHandler.registerCallback(zonedCallback(this._fbloginService.successCallback), zonedCallback(this._fbloginService.cancelCallback), zonedCallback(this._fbloginService.failCallback));
或者另一种方式:

import {Injectable, NgZone} from "@angular/core";
import {Router} from "@angular/router-deprecated";

@Injectable()
export class FbloginService {
    constructor(private _router: Router, private ngZone: NgZone){
    }

    successCallback(result) {
      this.ngZone.run(() => {
        var token;
        token = result.getAccessToken().getToken();
        console.log(token);
        this._router.navigate(['Home']);
      });
    }
}

另请参见:

您需要使用{N}运行时全局、
zonedCallback
,或使用
NgZone
。回调到{N}+ng2代码的第三方插件/服务需要通过区域运行。例如:

declare var zonedCallback: any;

@Component({
    selector: "login",
    providers: [FbloginService],
        templateUrl: "pages/login/login.html",
    })

export class LoginComponent {

constructor(private _fbloginService: FbloginService) {
}

facebookLogin(){
    FacebookLoginHandler.init();
    //Register our callbacks
    FacebookLoginHandler.registerCallback(zonedCallback(this._fbloginService.successCallback), zonedCallback(this._fbloginService.cancelCallback), zonedCallback(this._fbloginService.failCallback));
或者另一种方式:

import {Injectable, NgZone} from "@angular/core";
import {Router} from "@angular/router-deprecated";

@Injectable()
export class FbloginService {
    constructor(private _router: Router, private ngZone: NgZone){
    }

    successCallback(result) {
      this.ngZone.run(() => {
        var token;
        token = result.getAccessToken().getToken();
        console.log(token);
        this._router.navigate(['Home']);
      });
    }
}

也可以看到这一点:

是否将
此替换为
\u router
内部成功回调使用
\u router
工作?我得到一个生成错误,然后是app/services/fblogin.service.ts(14,9):错误TS2663:找不到名称“\u router”。您是指实例成员“this.\u router”?将用
\u router
工作替换
this.\u router
内部成功回调?我收到一个生成错误,然后是app/services/fblogin.service.ts(14,9):错误TS2663:找不到名称“\u router”。您是指实例成员“this.\u router”?如果回调访问
this
,则它应该是
FacebookLoginHandler.registerCallback(()=>this.\u fbloginService.successCallback(),()=>this.\u fbloginService.cancelCallback(),()=>this.\u fbloginService.failCallback());
其中应在
(…)
中插入预期参数以获得转发,或者可以选择“FacebookLoginHandler.registerCallback”(this.\u fbloginService.successCallback.bind(this),this.\u fbloginService.cancelCallback.bind(this),this.\u fbloginService.failCallback.bind(this))`我不明白你的答案会有什么不同,但我可能会遗漏一些东西。为了让它从typescript编译,我将你的建议编辑为
successCB(result){this.\u fbloginService.successCallback(result);}
仍然存在错误
TypeError:无法读取未定义的属性“\u fbloginService”
我认为该插件是为nativescript版本1制作的,这可能会导致主要问题。实际上,我上面使用
bind()
的示例应该是
bind(this.fbloginService)
而不是
bind(this)
@GünterZöchbauer您的第一个建议很有效!我使用了
FacebookLoginHandler.registerCallback((结果)=>this.\u fbloginService.successCallback(结果),
现在它可以识别服务中的路由器(我通过输入inccorect路由变量进行测试,它会弹出一个错误)。无论现在的行为多么不寻常,它都会忽略导航方法,尽管我第一次读取它,当我再次单击登录按钮运行works@AngJobs请随意将我的评论添加到您的答案中。如果回调访问
this
,那么它应该是
FacebookLoginHandler.registerCallback()=>此.\u fbloginService.successCallback(),()=>此.\u fbloginService.cancelCallback(),()=>此.\u fbloginService.failCallback();
其中应插入预期参数以获得转发,或者` FacebookLoginHandler.registerCallback(此.\u fbloginService.successCallback.bind(此)我不明白你的答案会有什么不同,但我可能会错过一些东西。为了让它从类型脚本编译,我将你的建议编辑为
successCB(result){this.\u fbloginService.successCallback(result)}
仍然存在错误
TypeError:无法读取未定义的属性“\u fbloginService”
我认为该插件是为nativescript版本1制作的,这可能会导致主要问题。实际上,我上面使用
bind()
的示例应该是
bind(this.fbloginService)
而不是
bind(this)
@GünterZöchbauer您的第一个建议很有效!我使用了
FacebookLoginHandler.registerCallback((结果)=>this.\u fbloginService.successCallback(结果),
现在它在服务中识别路由器