Android Can';t将路由器与Nativescript的facebook登录插件一起使用
我创建的导入FB登录插件的组件(登录部分工作正常): 您可以在FacebookLoginHandler.registerCallback方法的末尾看到。我注册了登录成功时调用的fblogin服务,该服务存储在fblogin.service.ts中,如下所示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
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(结果),
现在它在服务中识别路由器