NativeScript переходит на другую страницу из пользовательской активности Android

Я разрабатываю приложение с функцией входа в систему WeChat. После получения одобрения от wechat он вызовет пользовательскую активность моего приложения NativeScript. Я получаю ответ правильно, но как я могу перейти на другую страницу, установленную на домашней странице, после некоторой проверки. Я использую NativeScript + Angular.

Образец кода

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: Unhandled Promise rejection: Cannot set property '_moduleName' of undefined ; Zone: ; Task: Promise.then ; Value: TypeError: Cannot set property '_moduleName' of undefined TypeError: Cannot set property '_moduleName' of undefined

Пожалуйста, дайте мне несколько предложений. Заранее спасибо :)

Если вы используете Angular, используйте RouterExtension для навигации.

Manoj 12.05.2019 15:41

Если ваша проблема связана с получением ссылки на экземпляр RouterExtensions из пользовательской активности, вы можете просто запустить событие в модуле приложения из пользовательской активности (аналогично другим глобальным событиям, таким как пауза, возобновление и т. д.) и прослушать то же самое из вашего Компонент Angular (может быть компонентом приложения), куда вы можете внедрить и получить доступ к экземпляру RouterExtensions.

Manoj 12.05.2019 15:53

Спасибо за ваш ответ @Manoj. Я пытался использовать RouterExtensions непосредственно в пользовательской активности, но безуспешно. Не могли бы вы привести пример/пример кода относительно event, как вы упомянули?

Jibon 12.05.2019 20:05
0
3
982
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Подобная проблема стоила мне целых выходных, не зная, как выглядят файлы .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.info("Target page Loaded.");
}

Запустите отладчик и просмотрите, где у вас есть значения null, и прочитайте эти вызовы методов и их параметры.

К вашему сведению, вы не будете иметь дело со страницей / фреймом напрямую в Angular, об этом позаботится Router.

Manoj 12.05.2019 21:22
Ответ принят как подходящий

Запустите событие из обратного вызова Activity, что-то вроде

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

...

public onResp(res: com.tencent.mm.opensdk.modelbase.BaseResp) {
    console.info("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(...);
       });
    }
}

Я следовал вашему коду, но он не перемещается по странице. Он остается на той же странице :(

Jibon 13.05.2019 05:07

Я тоже пытался с setTimeout, но все равно не повезло :( . Событие срабатывало правильно, но не перемещалось :(

Jibon 13.05.2019 05:12

Если я буду использовать setTimeout в методе onResp, то он работает. Большое спасибо! setTimeout(() => { androidApp.notify(<AndroidActivityEventData>{ eventName: 'wxapiresponse', object: res, activity: this }); }, 1000);

Jibon 13.05.2019 05:23

Другие вопросы по теме