{"id":1140,"date":"2017-08-15T07:00:49","date_gmt":"2017-08-15T14:00:49","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/"},"modified":"2017-08-15T07:00:49","modified_gmt":"2017-08-15T14:00:49","slug":"bringing-user-profile-store-mobile-nativescript-angular","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/bringing-user-profile-store-mobile-nativescript-angular\/","title":{"rendered":"Bringing Your User Profile Store to Mobile with NativeScript and Angular"},"content":{"rendered":"\n<p>Continuing down the path of user profile stores, we had previously seen <a href=\"https:\/\/www.couchbase.com\/blog\/creating-user-profile-store-with-node-js-nosql-database\/\" target=\"_blank\" rel=\"noopener\">how to create one with Node.js and Couchbase NoSQL<\/a> as well as a <a href=\"https:\/\/www.couchbase.com\/blog\/creating-front-end-user-profile-store-angular-typescript\/\" target=\"_blank\" rel=\"noopener\">web client front-end for it using Angular<\/a>. What if we wanted to take this into a mobile application, which is the norm for all applications as of now.<\/p>\n\n\n\n<p>There are many different mobile frameworks out there and we&#8217;re lucky that some even support Angular, which is what we had used in the previous example. We&#8217;re going to see how to convert our client front-end to mobile using <a href=\"https:\/\/www.nativescript.org\" target=\"_blank\" rel=\"noopener\">NativeScript<\/a> and Angular.<\/p>\n\n\n\n<p><!--more--><\/p>\n\n\n\n<p>Before going forward, the assumption is that you&#8217;ve completely both of the two previous tutorials, one on <a href=\"https:\/\/www.couchbase.com\/blog\/creating-user-profile-store-with-node-js-nosql-database\/\" target=\"_blank\" rel=\"noopener\">creating the profile store backend<\/a> and the other on <a href=\"https:\/\/www.couchbase.com\/blog\/creating-front-end-user-profile-store-angular-typescript\/\" target=\"_blank\" rel=\"noopener\">creating the profile store web front-end<\/a>. We&#8217;re also going to assume that your development environment is property configured for mobile development, whether that be Android, iOS, or both.<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3887 size-full\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/ns-angular-profile-store.gif\" alt=\"NativeScript with Couchbase Profile Store\" width=\"1100\" height=\"709\"><\/p>\n\n\n\n<p>The flow of events in this application will match what we saw in the web version.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Create a New NativeScript with Angular Project<\/h2>\n\n\n\n<p>Assuming that you&#8217;ve gotten the NativeScript CLI installed and configured, execute the following to create a new project:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]tns create profile-project-ns &#8211;ng[\/crayon]<\/p>\n\n\n\n<p>The <code>--ng<\/code> flag in the above command is important because it means we are creating an Angular project rather than a NativeScript Core project.<\/p>\n\n\n\n<p>As of right now, the NativeScript CLI doesn&#8217;t share the Angular CLI capabilities of generating components. For this reason, we&#8217;re going to have to create each of the HTML and TypeScript files manually.<\/p>\n\n\n\n<p>If you&#8217;re on Mac or Linux, execute the following from within the NativeScript project:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]mkdir -p app\/login<br \/>\nmkdir -p app\/register<br \/>\nmkdir -p app\/blogs<br \/>\nmkdir -p app\/blog<br \/>\ntouch app\/login\/login.component.html<br \/>\ntouch app\/login\/login.component.ts<br \/>\ntouch app\/register\/register.component.html<br \/>\ntouch app\/register\/register.component.ts<br \/>\ntouch app\/blogs\/blogs.component.html<br \/>\ntouch app\/blogs\/blogs.component.ts<br \/>\ntouch app\/blog\/blog.component.html<br \/>\ntouch app\/blog\/blog.component.ts[\/crayon]<\/p>\n\n\n\n<p>If you&#8217;re on Windows, just create those directories and files manually. If you really wanted to, you could copy these directories and files from your web project from the <a href=\"https:\/\/www.couchbase.com\/blog\/creating-front-end-user-profile-store-angular-typescript\/\" target=\"_blank\" rel=\"noopener\">previous tutorial<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Defining the Components to Represent Each Screen<\/h2>\n\n\n\n<p>Starting in the same direction as the web version, we&#8217;re going to focus on user login. Open the project&#8217;s\u00a0<strong>app\/login\/login.component.ts<\/strong> file and include the following code:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]import { Component } from &#8216;@angular\/core&#8217;;<br \/>\nimport { Http, Headers, RequestOptions } from &#8220;@angular\/http&#8221;;<br \/>\nimport { Router } from &#8220;@angular\/router&#8221;;<br \/>\nimport &#8220;rxjs\/Rx&#8221;;<\/p>\n<p>@Component({<br \/>\n    moduleId: module.id,<br \/>\n    selector: &#8216;app-login&#8217;,<br \/>\n    templateUrl: &#8216;.\/login.component.html&#8217;<br \/>\n})<br \/>\nexport class LoginComponent {<\/p>\n<p>    public input: any;<\/p>\n<p>    constructor(private http: Http, private router: Router) {<br \/>\n        this.input = {<br \/>\n            &#8220;email&#8221;: &#8220;&#8221;,<br \/>\n            &#8220;password&#8221;: &#8220;&#8221;<br \/>\n        };<br \/>\n    }<\/p>\n<p>    public login() {<br \/>\n        if(this.input.email &amp;&amp; this.input.password) {<br \/>\n            let headers = new Headers({ &#8220;content-type&#8221;: &#8220;application\/json&#8221; });<br \/>\n            let options = new RequestOptions({ headers: headers });<br \/>\n            this.http.post(&#8220;https:\/\/localhost:3000\/login&#8221;, JSON.stringify(this.input), options)<br \/>\n                .map(result =&gt; result.json())<br \/>\n                .subscribe(result =&gt; {<br \/>\n                    this.router.navigate([&#8220;\/blogs&#8221;], { &#8220;queryParams&#8221;: result });<br \/>\n                });<br \/>\n        }<br \/>\n    }<\/p>\n<p>}[\/crayon]<\/p>\n\n\n\n<p>The above code is exactly what we saw in the web version with two exceptions. I&#8217;ve removed the CSS reference since we did not create a CSS file on a component basis. I&#8217;ve also added a <code>moduleId<\/code> so relative paths could work with our component. These are both Angular related items with nothing to do with NativeScript.<\/p>\n\n\n\n<p>The HTML is where things are different. Open the project&#8217;s\u00a0<strong>app\/login\/login.component.html<\/strong> file and include the following XML markup:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]&lt;ActionBar title=&#8221;{N} Profile Store&#8221;&gt;&lt;\/ActionBar&gt;<br \/>\n&lt;StackLayout class=&#8221;form&#8221;&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Email&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; [(ngModel)]=&#8221;input.email&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Password&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; secure=&#8221;true&#8221; [(ngModel)]=&#8221;input.password&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Button class=&#8221;btn btn-primary&#8221; text=&#8221;Login&#8221; (tap)=&#8221;login()&#8221;&gt;&lt;\/Button&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Register here.&#8221; [nsRouterLink]=&#8221;[&#8216;\/register&#8217;]&#8221; class=&#8221;text-center&#8221;&gt;&lt;\/Label&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n&lt;\/StackLayout&gt;[\/crayon]<\/p>\n\n\n\n<p>NativeScript has its own markup for the UI. The same rules apply in terms of Angular, but creating UI components is just a bit different.<\/p>\n\n\n\n<p>For example, we are still using the <code>[(ngModel)]<\/code> attributes, but instead of <code>div<\/code> tags, we have <code>StackLayout<\/code> tags.<\/p>\n\n\n\n<p>Now let&#8217;s take a look at the registration component. Open the project&#8217;s\u00a0<strong>app\/register\/register.component.ts<\/strong> file and include the following TypeScript:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]import { Component } from &#8216;@angular\/core&#8217;;<br \/>\nimport { Http, Headers, RequestOptions } from &#8220;@angular\/http&#8221;;<br \/>\nimport { Router } from &#8220;@angular\/router&#8221;;<br \/>\nimport &#8220;rxjs\/Rx&#8221;;<\/p>\n<p>@Component({<br \/>\n    moduleId: module.id,<br \/>\n    selector: &#8216;app-register&#8217;,<br \/>\n    templateUrl: &#8216;.\/register.component.html&#8217;<br \/>\n})<br \/>\nexport class RegisterComponent {<\/p>\n<p>    public input: any;<\/p>\n<p>    public constructor(private http: Http, private router: Router) {<br \/>\n        this.input = {<br \/>\n            &#8220;firstname&#8221;: &#8220;&#8221;,<br \/>\n            &#8220;lastname&#8221;: &#8220;&#8221;,<br \/>\n            &#8220;email&#8221;: &#8220;&#8221;,<br \/>\n            &#8220;password&#8221;: &#8220;&#8221;<br \/>\n        };<br \/>\n    }<\/p>\n<p>    public register() {<br \/>\n        if(this.input.email &amp;&amp; this.input.password) {<br \/>\n            let headers = new Headers({ &#8220;content-type&#8221;: &#8220;application\/json&#8221; });<br \/>\n            let options = new RequestOptions({ headers: headers });<br \/>\n            this.http.post(&#8220;https:\/\/localhost:3000\/account&#8221;, JSON.stringify(this.input), options)<br \/>\n                .map(result =&gt; result.json())<br \/>\n                .subscribe(result =&gt; {<br \/>\n                    this.router.navigate([&#8220;\/login&#8221;]);<br \/>\n                });<br \/>\n        }<br \/>\n    }<\/p>\n<p>}[\/crayon]<\/p>\n\n\n\n<p>Again, the only changes we made in the above code, compared to the previous example, is in the CSS removal and <code>moduleId<\/code> addition.<\/p>\n\n\n\n<p>Not bad when it comes to creating cross platform web and mobile applications right?<\/p>\n\n\n\n<p>The HTML for the UI that powers the TypeScript logic is found in the\u00a0<strong>app\/register\/register.component.html<\/strong> file and it looks like this:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]&lt;ActionBar title=&#8221;{N} Profile Store&#8221;&gt;&lt;\/ActionBar&gt;<br \/>\n&lt;StackLayout class=&#8221;form&#8221;&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;First Name&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; [(ngModel)]=&#8221;input.firstname&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Last Name&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; [(ngModel)]=&#8221;input.lastname&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Email&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; [(ngModel)]=&#8221;input.email&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Password&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; secure=&#8221;true&#8221; [(ngModel)]=&#8221;input.password&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Button class=&#8221;btn btn-primary&#8221; text=&#8221;Register&#8221; (tap)=&#8221;register()&#8221;&gt;&lt;\/Button&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Login here.&#8221; [nsRouterLink]=&#8221;[&#8216;\/login&#8217;]&#8221; class=&#8221;text-center&#8221;&gt;&lt;\/Label&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n&lt;\/StackLayout&gt;[\/crayon]<\/p>\n\n\n\n<p>The final two components are going to be no different from what we&#8217;re already experiencing.<\/p>\n\n\n\n<p>Open the project&#8217;s\u00a0<strong>app\/blogs\/blogs.component.ts<\/strong> file and include the following TypeScript code:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]import { Component, OnInit } from &#8216;@angular\/core&#8217;;<br \/>\nimport { Http, Headers, RequestOptions } from &#8220;@angular\/http&#8221;;<br \/>\nimport { Router, ActivatedRoute } from &#8220;@angular\/router&#8221;;<br \/>\nimport { Location } from &#8220;@angular\/common&#8221;;<br \/>\nimport &#8220;rxjs\/Rx&#8221;;<\/p>\n<p>@Component({<br \/>\n    moduleId: module.id,<br \/>\n    selector: &#8216;app-blogs&#8217;,<br \/>\n    templateUrl: &#8216;.\/blogs.component.html&#8217;<br \/>\n})<br \/>\nexport class BlogsComponent implements OnInit {<\/p>\n<p>    private sid: string;<br \/>\n    public entries: Array&lt;any&gt;;<\/p>\n<p>    public constructor(private http: Http, private router: Router, private route: ActivatedRoute, private location: Location) {<br \/>\n        this.entries = [];<br \/>\n    }<\/p>\n<p>    public ngOnInit() {<br \/>\n        this.location.subscribe(() =&gt; {<br \/>\n            let headers = new Headers({ &#8220;authorization&#8221;: &#8220;Bearer &#8221; + this.sid });<br \/>\n            let options = new RequestOptions({ headers: headers });<br \/>\n            this.http.get(&#8220;https:\/\/localhost:3000\/blogs&#8221;, options)<br \/>\n                .map(result =&gt; result.json())<br \/>\n                .subscribe(result =&gt; {<br \/>\n                    this.entries = result;<br \/>\n                });<br \/>\n        });<br \/>\n        this.route.queryParams.subscribe(params =&gt; {<br \/>\n            this.sid = params[&#8220;sid&#8221;];<br \/>\n            let headers = new Headers({ &#8220;authorization&#8221;: &#8220;Bearer &#8221; + params[&#8220;sid&#8221;] });<br \/>\n            let options = new RequestOptions({ headers: headers });<br \/>\n            this.http.get(&#8220;https:\/\/localhost:3000\/blogs&#8221;, options)<br \/>\n                .map(result =&gt; result.json())<br \/>\n                .subscribe(result =&gt; {<br \/>\n                    this.entries = result;<br \/>\n                });<br \/>\n        });<br \/>\n    }<\/p>\n<p>    public create() {<br \/>\n        this.router.navigate([&#8220;\/blog&#8221;], { &#8220;queryParams&#8221;: { &#8220;sid&#8221;: this.sid } });<br \/>\n    }<\/p>\n<p>}[\/crayon]<\/p>\n\n\n\n<p>No changes to see in the above other than the two previously mentioned, so we can move into our HTML for the page.<\/p>\n\n\n\n<p>Open the project&#8217;s\u00a0<strong>app\/blogs\/blogs.component.html<\/strong> file and include the following HTML markup:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]&lt;ActionBar title=&#8221;{N} Profile Store&#8221;&gt;<br \/>\n    &lt;ActionItem text=&#8221;New&#8221; ios.position=&#8221;right&#8221; (tap)=&#8221;create()&#8221;&gt;&lt;\/ActionItem&gt;<br \/>\n    &lt;NavigationButton text=&#8221;Back&#8221;&gt;&lt;\/NavigationButton&gt;<br \/>\n&lt;\/ActionBar&gt;<br \/>\n&lt;GridLayout rows=&#8221;*, auto&#8221; columns=&#8221;*&#8221;&gt;<br \/>\n    &lt;ListView [items]=&#8221;entries&#8221; class=&#8221;list-group&#8221; row=&#8221;0&#8243; col=&#8221;0&#8243;&gt;<br \/>\n        &lt;ng-template let-entry=&#8221;item&#8221;&gt;<br \/>\n            &lt;StackLayout class=&#8221;list-group-item&#8221;&gt;<br \/>\n                &lt;Label text=&#8221;{{ entry.title }}&#8221; class=&#8221;h2&#8243;&gt;&lt;\/Label&gt;<br \/>\n                &lt;Label text=&#8221;{{ entry.content }}&#8221;&gt;&lt;\/Label&gt;<br \/>\n            &lt;\/StackLayout&gt;<br \/>\n        &lt;\/ng-template&gt;<br \/>\n    &lt;\/ListView&gt;<br \/>\n    &lt;StackLayout row=&#8221;1&#8243; col=&#8221;0&#8243; padding=&#8221;10&#8243; backgroundColor=&#8221;#F0F0F0&#8243;&gt;<br \/>\n        &lt;Label text=&#8221;Logout&#8221; [nsRouterLink]=&#8221;[&#8216;\/login&#8217;]&#8221;&gt;&lt;\/Label&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n&lt;\/GridLayout&gt;[\/crayon]<\/p>\n\n\n\n<p>Let&#8217;s wrap this application up with the final component that our profile store API and web front-end has to offer.<\/p>\n\n\n\n<p>Open the project&#8217;s\u00a0<strong>app\/blog\/blog.component.ts<\/strong> file and include this:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]import { Component, OnInit } from &#8216;@angular\/core&#8217;;<br \/>\nimport { Http, Headers, RequestOptions } from &#8220;@angular\/http&#8221;;<br \/>\nimport { ActivatedRoute } from &#8220;@angular\/router&#8221;;<br \/>\nimport { Location } from &#8220;@angular\/common&#8221;;<br \/>\nimport &#8220;rxjs\/Rx&#8221;;<\/p>\n<p>@Component({<br \/>\n    moduleId: module.id,<br \/>\n    selector: &#8216;app-blog&#8217;,<br \/>\n    templateUrl: &#8216;.\/blog.component.html&#8217;<br \/>\n})<br \/>\nexport class BlogComponent implements OnInit {<\/p>\n<p>    private sid: string;<br \/>\n    public input: any;<\/p>\n<p>    public constructor(private http: Http, private route: ActivatedRoute, private location: Location) {<br \/>\n        this.input = {<br \/>\n            &#8220;title&#8221;: &#8220;&#8221;,<br \/>\n            &#8220;content&#8221;: &#8220;&#8221;<br \/>\n        };<br \/>\n    }<\/p>\n<p>    public ngOnInit() {<br \/>\n        this.route.queryParams.subscribe(params =&gt; {<br \/>\n            this.sid = params[&#8220;sid&#8221;];<br \/>\n        });<br \/>\n    }<\/p>\n<p>    public save() {<br \/>\n        if(this.input.title &amp;&amp; this.input.content) {<br \/>\n            let headers = new Headers({<br \/>\n                &#8220;content-type&#8221;: &#8220;application\/json&#8221;,<br \/>\n                &#8220;authorization&#8221;: &#8220;Bearer &#8221; + this.sid<br \/>\n            });<br \/>\n            let options = new RequestOptions({ headers: headers });<br \/>\n            this.http.post(&#8220;https:\/\/localhost:3000\/blog&#8221;, JSON.stringify(this.input), options)<br \/>\n                .map(result =&gt; result.json())<br \/>\n                .subscribe(result =&gt; {<br \/>\n                    this.location.back();<br \/>\n                });<br \/>\n        }<br \/>\n    }<\/p>\n<p>}[\/crayon]<\/p>\n\n\n\n<p>If you didn&#8217;t copy over your CSS file, don&#8217;t forget to remove it from the <code>@Component<\/code> block as seen in the previous components.<\/p>\n\n\n\n<p>The HTML UI to go with this TypeScript is found in the project&#8217;s\u00a0<strong>app\/blog\/blog.component.html<\/strong> file and it looks like the following:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]&lt;ActionBar title=&#8221;{N} Profile Store&#8221;&gt;<br \/>\n    &lt;NavigationButton text=&#8221;Back&#8221;&gt;&lt;\/NavigationButton&gt;<br \/>\n&lt;\/ActionBar&gt;<br \/>\n&lt;StackLayout class=&#8221;form&#8221;&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Title&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; [(ngModel)]=&#8221;input.title&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Content&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextView class=&#8221;input&#8221; [(ngModel)]=&#8221;input.content&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextView&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Button class=&#8221;btn btn-primary&#8221; text=&#8221;Save&#8221; (tap)=&#8221;save()&#8221;&gt;&lt;\/Button&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n&lt;\/StackLayout&gt;[\/crayon]<\/p>\n\n\n\n<p>As of right now you may be scratching your head on all this NativeScript XML markup. How Angular works with the UI hasn&#8217;t changed, but if you&#8217;re interested in learning about the NativeScript markup, check out their <a href=\"https:\/\/docs.nativescript.org\/angular\/start\/introduction.html\" target=\"_blank\" rel=\"noopener\">official documentation<\/a>. Get familiar with the <code>StackLayout<\/code>, <code>GridLayout<\/code> and individual UI component tags.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bringing it Together<\/h2>\n\n\n\n<p>We&#8217;ve created all these Angular components for NativeScript, but we haven&#8217;t brought them together via the Angular Router.<\/p>\n\n\n\n<p>In the web version of this guide, the route information was in the\u00a0<strong>app.module.ts<\/strong> file. While we could do that, NativeScript broke it out into a separate file.<\/p>\n\n\n\n<p>Open the project&#8217;s\u00a0<strong>app\/app.routing.ts<\/strong> file and include the following:<\/p>\n\n\n\n<p><p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]mkdir -p app\/login<br \/>\nmkdir -p app\/register<br \/>\nmkdir -p app\/blogs<br \/>\nmkdir -p app\/blog<br \/>\ntouch app\/login\/login.component.html<br \/>\ntouch app\/login\/login.component.ts<br \/>\ntouch app\/register\/register.component.html<br \/>\ntouch app\/register\/register.component.ts<br \/>\ntouch app\/blogs\/blogs.component.html<br \/>\ntouch app\/blogs\/blogs.component.ts<br \/>\ntouch app\/blog\/blog.component.html<br \/>\ntouch app\/blog\/blog.component.ts[\/crayon]<\/p>\n0<\/p>\n\n\n\n<p>A lot of the above code came with our new project template. We imported each of our components, and created a route for them.<\/p>\n\n\n\n<p>Likewise, the components need to be imported in the project&#8217;s\u00a0<strong>app\/app.module.ts<\/strong> file. Open this file and include the following:<\/p>\n\n\n\n<p><p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]mkdir -p app\/login<br \/>\nmkdir -p app\/register<br \/>\nmkdir -p app\/blogs<br \/>\nmkdir -p app\/blog<br \/>\ntouch app\/login\/login.component.html<br \/>\ntouch app\/login\/login.component.ts<br \/>\ntouch app\/register\/register.component.html<br \/>\ntouch app\/register\/register.component.ts<br \/>\ntouch app\/blogs\/blogs.component.html<br \/>\ntouch app\/blogs\/blogs.component.ts<br \/>\ntouch app\/blog\/blog.component.html<br \/>\ntouch app\/blog\/blog.component.ts[\/crayon]<\/p>\n1<\/p>\n\n\n\n<p>In addition to importing each component and adding them to the <code>declarations<\/code> array, we also imported a few modules such as the <code>NativeScriptHttpModule<\/code> and <code>NativeScriptFormsModule<\/code>. In pure Angular, these are called the <code>HttpModule<\/code> and <code>FormsModule<\/code>.<\/p>\n\n\n\n<p>In theory, the application is ready to go.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resolving App Transport Security Issues (ATS) for iOS<\/h2>\n\n\n\n<p>Because the Node.js and Couchbase API is running locally, we are using HTTP rather than HTTPS. iOS will throw errors if we try to access HTTP resources.<\/p>\n\n\n\n<p>This is easily fixable by adding an ATS policy.<\/p>\n\n\n\n<p>Open the project&#8217;s\u00a0<strong>app\/App_Resources\/iOS\/Info.plist<\/strong> and add the following alongside the other XML:<\/p>\n\n\n\n<p><p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]mkdir -p app\/login<br \/>\nmkdir -p app\/register<br \/>\nmkdir -p app\/blogs<br \/>\nmkdir -p app\/blog<br \/>\ntouch app\/login\/login.component.html<br \/>\ntouch app\/login\/login.component.ts<br \/>\ntouch app\/register\/register.component.html<br \/>\ntouch app\/register\/register.component.ts<br \/>\ntouch app\/blogs\/blogs.component.html<br \/>\ntouch app\/blogs\/blogs.component.ts<br \/>\ntouch app\/blog\/blog.component.html<br \/>\ntouch app\/blog\/blog.component.ts[\/crayon]<\/p>\n2<\/p>\n\n\n\n<p>The above essentially whitelists all HTTP endpoints. It is not safe for production, but safe for testing.<\/p>\n\n\n\n<p>More information on ATS in NativeScript applications can be read about in a previous article I wrote titled,\u00a0<a href=\"https:\/\/www.thepolyglotdeveloper.com\/2015\/12\/fix-ios-9-app-transport-security-issues-in-nativescript\/\" target=\"_blank\" rel=\"noopener\">Fix iOS 9 App Transport Security Issues in NativeScript<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>You just saw how easy it was to take your web client front-end and convert it to mobile using NativeScript and Angular. The user profile store example quickly became a full stack example using the JavaScript stack. We had a Node.js with <a href=\"https:\/\/www.couchbase.com\" target=\"_blank\" rel=\"noopener\">Couchbase Server<\/a> backend, Angular web front-end, and NativeScript mobile front-end.<\/p>\n\n\n\n<p>The next step, or option, would be to use the Couchbase Mobile components rather than HTTP calls against the API.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Continuing down the path of user profile stores, we had previously seen how to create one with Node.js and Couchbase NoSQL as well as a web client front-end for it using Angular. What if we wanted to take this into a mobile application, which is the norm for all applications as of now. There are [&hellip;]<\/p>\n","protected":false},"author":63,"featured_media":18,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[127,136,54,163],"tags":[213,272,165,223,273,274],"ppma_author":[148],"class_list":["post-1140","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-couchbase-server","category-javascript","tag-angular","tag-front-end","tag-javascript","tag-nativescript","tag-profile-store","tag-typescript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.6 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Bringing Your User Profile Store to Mobile with NativeScript and Angular<\/title>\n<meta name=\"description\" content=\"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/ko\/bringing-user-profile-store-mobile-nativescript-angular\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bringing Your User Profile Store to Mobile with NativeScript and Angular\" \/>\n<meta property=\"og:description\" content=\"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/bringing-user-profile-store-mobile-nativescript-angular\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2017-08-15T14:00:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Bringing Your User Profile Store to Mobile with NativeScript and Angular\",\"datePublished\":\"2017-08-15T14:00:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\"},\"wordCount\":2518,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Angular\",\"front-end\",\"javascript\",\"nativescript\",\"profile store\",\"TypeScript\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Server\",\"JavaScript\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\",\"name\":\"Bringing Your User Profile Store to Mobile with NativeScript and Angular\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-08-15T14:00:49+00:00\",\"description\":\"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bringing Your User Profile Store to Mobile with NativeScript and Angular\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"width\":\"1024\",\"height\":\"1024\",\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\\\/\\\/www.thepolyglotdeveloper.com\",\"https:\\\/\\\/www.facebook.com\\\/thepolyglotdeveloper\",\"https:\\\/\\\/x.com\\\/nraboy\"],\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ko\\\/author\\\/nic-raboy-2\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Bringing Your User Profile Store to Mobile with NativeScript and Angular","description":"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/ko\/bringing-user-profile-store-mobile-nativescript-angular\/","og_locale":"ko_KR","og_type":"article","og_title":"Bringing Your User Profile Store to Mobile with NativeScript and Angular","og_description":"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/bringing-user-profile-store-mobile-nativescript-angular\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2017-08-15T14:00:49+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"13\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Bringing Your User Profile Store to Mobile with NativeScript and Angular","datePublished":"2017-08-15T14:00:49+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/"},"wordCount":2518,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","keywords":["Angular","front-end","javascript","nativescript","profile store","TypeScript"],"articleSection":["Application Design","Best Practices and Tutorials","Couchbase Server","JavaScript"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/","url":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/","name":"Bringing Your User Profile Store to Mobile with NativeScript and Angular","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","datePublished":"2017-08-15T14:00:49+00:00","description":"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Bringing Your User Profile Store to Mobile with NativeScript and Angular"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","width":"1024","height":"1024","caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, Developer Advocate, Couchbase","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/nic-raboy-2\/"}]}},"acf":[],"authors":[{"term_id":148,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/1140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=1140"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/1140\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/18"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=1140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=1140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=1140"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=1140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}