NativeScript从自定义Android活动导航到另一个页面

时间:2019-05-12 10:25:35

标签: android nativescript nativescript-angular

我正在开发具有微信登录功能的APP。获得微信批准后,它将调用我的NativeScript APP的自定义活动。我正确地获得了响应,但是在进行一些验证之后如何才能移至主页上的其他页面。我正在使用NativeScript + Angular。

Sample code

getJSON("https://api.weixin.qq.com/sns/oauth2/access_token?appid=ID&secret=SECRET&code=" + res.code + "&grant_type=authorization_code").then((res) => {
    console.dir(res);
    // ===> here I want navigation
}, err => {
    console.dir(err);
})

我尝试过这样:

frame.topmost().navigate("src/app/login/login.component");

但出现错误:

  

JS:未处理的承诺拒绝:无法将属性'_moduleName'设置为undefined;区域:任务:Promise.then;值:TypeError:无法设置未定义的属性“ _moduleName”

请给我一些建议。在此先感谢:)

2 个答案:

答案 0 :(得分:0)

一个类似的问题使我花了整个周末的时间,却不知道伴侣控制器 .js.ts 的文件看起来如何,我只能推荐您使用基础知识/源代码:

https://docs.nativescript.org/core-concepts/navigation#frame

它帮助我在代码中找到问题。

如果您编写的自定义页面不是以 template 开头的,那么您也有可能编写了控制器,并且很容易忽略示例中存在的某些行-即使您看起来您不需要它。

如果粘贴控制器JS,我们可以理解您的上下文。

例如,下面是您绝对应包括的代码以帮助您调试:

在您的 page-you-navigate-to.xml

<Page loaded="onPageLoaded" class="page">
...
</Page>

在您的 page-you-navigate-to.ts

import { EventData } from "tns-core-modules/data/observable";
import { Page } from "tns-core-modules/ui/page";

export function onPageLoaded(args: EventData): void {
    const page = <Page>args.object;
    var context = page.navigationContext;
    page.bindingContext = context;
    console.log("Target page Loaded.");
}

启动调试器,并逐步查看具有null值的位置,并阅读这些方法调用及其参数。

答案 1 :(得分:0)

从Activity回调中触发一个事件,例如

import { android } from "tns-core-modules/application";

...

public onResp(res: com.tencent.mm.opensdk.modelbase.BaseResp) {
    console.log("onResp");
    console.dir(res);
    androidApp.notify(<AndroidActivityEventData>{ eventName: 'wxapiresponse', object: android, activity: this });
}

在应用程序组件中,收听事件

export class AppComponent implements OnInit {
    constructor(private ngZone: NgZone, private routerExtensions: RouterExtensions) {}

    ngOnInit() {
      application.android.on('wxapiresponse', this.wxApiResponse, this);
    }

    wxApiResponse() {
       // making sure the event callback runs inside Angular zone
       this.ngZone.run(() => {
          this.routerExtensions.navigate(...);
       });
    }
}