Я разрабатываю приложение с функцией входа в систему 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
Пожалуйста, дайте мне несколько предложений. Заранее спасибо :)
Если ваша проблема связана с получением ссылки на экземпляр RouterExtensions из пользовательской активности, вы можете просто запустить событие в модуле приложения из пользовательской активности (аналогично другим глобальным событиям, таким как пауза, возобновление и т. д.) и прослушать то же самое из вашего Компонент Angular (может быть компонентом приложения), куда вы можете внедрить и получить доступ к экземпляру RouterExtensions.
Спасибо за ваш ответ @Manoj. Я пытался использовать RouterExtensions непосредственно в пользовательской активности, но безуспешно. Не могли бы вы привести пример/пример кода относительно event, как вы упомянули?
Подобная проблема стоила мне целых выходных, не зная, как выглядят файлы .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.
Запустите событие из обратного вызова 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(...);
});
}
}
Я следовал вашему коду, но он не перемещается по странице. Он остается на той же странице :(
Я тоже пытался с setTimeout, но все равно не повезло :( . Событие срабатывало правильно, но не перемещалось :(
Если я буду использовать setTimeout в методе onResp, то он работает. Большое спасибо! setTimeout(() => { androidApp.notify(<AndroidActivityEventData>{ eventName: 'wxapiresponse', object: res, activity: this }); }, 1000);
Если вы используете Angular, используйте RouterExtension для навигации.