Nativescript + Angular 2 base screen template - nativescript

Is it possible to create some base screen template (master screen) and use it in other screens?
For example I have application Component like this
#Component({
selector: "main",
directives: [NS_ROUTER_DIRECTIVES, Bar],
template : `
<StackLayout orientation="vertical">
<bar-component>
</bar-component>
<page-router-outlet></page-router-outlet>
</StackLayout>
` })
I'd like to have in all screens, but now I have it only on my very first screen ("" route) and then after changing screen using this._router.navigate(["/details"]); ("details" route) I can't see my . Do I do something wrong? Could you tell my please how can I create this functionality if it's possible.

try use <router-outlet></router-outlet> instead of <page-router-outlet>.
I think this test code from nativescript angular, shows what you want to do:
https://github.com/NativeScript/nativescript-angular/blob/master/ng-sample/app/examples/router/router-outlet-test.ts

Related

NativeScript Reuse Actionbar (with RadSideDrawer)?

Is there a way to create a reusable ActionBar for all pages?
I followed this tutorial which walked me through the process of adding in a RadSideDrawer to my 4 page app (not 100% if using a sidedrawer would change how I could approach this problem).
The 4 pages all have the same ActionBar. Instead of copy/pasting the code on each page (and updating on each page with changes), how do I reuse the same code for them all?
I tried statically defining the ActionBar code in the Frame content...
<template lang="html">
<Page>
<RadSideDrawer>
<StackLayout ~drawerContent>
<slot name="drawerContent"></slot>
</StackLayout>
<Frame ~mainContent>
<!-- TRIED PUTTING ACTIONBAR STRUCTURE HERE? -->
<slot name="mainContent"></slot>
</Frame>
</RadSideDrawer>
</Page>
</template>
I've also tried creating a custom component (with my ActionBar code living in /widgets/header/header.xml), by following this tutorial...
<Page xmlns:header="widgets/header">
<header:header />
</Page>
But I got an error message in the console:
[Vue warn]: Unknown custom element: - did you register the component correctly? For recursive components, make sure to provide the "name" option.
My best guess, at this moment, is that NativeScript-Vue prefers the use of slots -- but how would I go about putting a slot into content that's populating another slot (<slot name="mainContent"></slot>)?

NativeScript ActionBar keeps re-appearing on navigation

I have a page with a hidden ActionBar (see below) which works fine normally. However when I navigate to another page and then use back() to get back, the ActionBar is now fully visible.
(Note: I require the ActionBar to be on the page so I can change the status bar colour)
This is for the current version of NativeScript Angular.
<ActionBar visibility="collapsed"></ActionBar>
<GridLayout rows="*, auto" columns="*" *ngIf="pageLoaded">
...
</GridLayout>
You can also add the Page class to your constructor and call this.page.actionBarHidden = true; in your ngOnInit.
This way you can also remove actionbar you have defined in your html template.
I was able to just remove the ActionBar and find a different way to change the text colour on the StatusBar, that doesn't require the ActionBar on the page.

Nativescript Custom search bar

is there anyway to customize the search-bar element that NativeScript provides ?
and add some buttons in it.
am trying to get something like this (the search-bar in this app)
I've been searching a bit but found nothing about it.
Basic demo here: https://play.nativescript.org/?template=play-vue&id=y6iFw9
You can always hide default action bar with actionBarHidden="true on your <page> element and then create your own action bar. In this case you can use GridLayout and put each element in its own column. Something like:
<Page actionBarHidden="true>
<StackLayout>
<GridLayout rows="auto columns="auto, *, auto, auto, auto>
<Label col="0 text="Menu"/>
<TextField col="1></TextField>
<Label col="2 text="icon1"/>
<Label col="3 text="icon2"/>
<Label col="4 text="icon3"/>
</GridLayout>
</StackLayout>
</Page>
Just replace labels with your icons, and add #tap="yourFunction to fire when icon is pressed. To turn labels into icons you can use package like Fonticon.
The search-bar from tns-core-modules doesn't provide what you're looking for (see the API at https://docs.nativescript.org/api-reference/modules/_ui_search_bar_). I'd recommend to implement the component yourself.

NativeScript Tab View Property binding tabItem error

I want to implement a TabView with Angular 2.0.1, NativeScript 2.3.0. I follow this official guide here, but run into an issue below.
<TabView #tabview>
[ERROR ->]<StackLayout *tabItem="{title: 'Profile'}" >
<ListView [items]='items'>
<template let-i"): LoginComponent#17:4
Property binding tabItem not used by any directive on an embedded template. Make sure that the property name is spelled correctly and all directives are listed in the "directives" section. ("
</ListView>
</StackLayout>
[ERROR ->]<StackLayout *tabItem="{title: 'Stats'}">
<Label text="Second tab item"></Label>
</StackLay"): LoginComponent#24:4
Property binding tabItem not used by any directive on an embedded template. Make sure that the property name is spelled correctly and all directives are listed in the "directives" section. ("
<Label text="Second tab item"></Label>
</StackLayout>
[ERROR ->]<StackLayout *tabItem="{title: 'Settings'}">
<Label text="Third tab item"></Label>
The error I got from the compiler is
Property binding tabItem not used by any directive on an embedded template. Make sure that the property name is spelled correctly and all directives are listed in the "directives" section.
I thought all of nativescript directives have been included by default, ex: Button, TextField, etc. Is *tabItem a special directive that I need to import manually?
By the way, What I really want to do, is to have a TabView stick at the bottom of the phone, like Dock with a few tabs, exactly like Facebook mobile app dock. Can someone post a code snippet?
Ensure you import NativeScriptModule in your Angular #NgModule:
import { NativeScriptModule } from 'nativescript-angular/platform';
...
#NgModule({
imports: [NativeScriptModule, ...]
})
Answer is late but hope it help someone else.
This question was asked over 2 years ago, but I ran into this error today and here's how I ended up fixing it. I use a structure where all pages are imported by a PageModule, and that PageModule is then imported by the AppModule. The issue at hand: PageModule doesn't know about the NativeScriptModule. If you add NativeScriptModule to the import array of your PageModule (or whatever other module you're using, could be for importing Components or anything else), it'll fix the problem.
import { NativeScriptModule } from "nativescript-angular/nativescript.module";
// Module declaration, not important
imports = [
// Other imports
NativeScriptModule
],
The common module is all you need to import, it's responsible for the tabViews and all it's child property and element.
import { NativeScriptCommonModule } from 'nativescript-angular/common';
don't forget to mount in your import.
#NgModule({
imports: [NativeScriptCommonModule, ...]
})

Use querySelector in nativescript;

i want to play an animation when a new message is added in the DOM.
but i don't know how to find my object and edit it with code in (this.zone.run) function :
addMessage(message: string){
this.messages.unshift(message);
// renderer
this.zone.run(() => {
});
}
here's the app.component.html
<StackLayout #container>
<ScrollView>
<WrapLayout #red>
<Label class="message" *ngFor="let message of messages" [text]="message"></Label>
</WrapLayout>
</ScrollView>
</StackLayout>
i want to edit the first child of the WrapLayout element
There is no DOM with NativeScript.
However a major community contributor wrote a plugin to help transition web developers into native development with NativeScript. This plugin provides helper methods that you'll find familiar to the web and DOM. https://github.com/NathanaelA/nativescript-dom
Just remember these are helper methods are not something provided out of the box by NativeScript. You can get any view by its id in NativeScript several ways and during different events (page/frame and component level).
I recall there's no page component with NativeScript with angular but I think you still have the frame module which you could do something like
frame.topmost().currentPage.getViewById('yourID');
Making sure you import(require) the frame module.

Resources