2016-06-28 11 views
3

NativeScript Angularを使用してアプリケーションを構築しています。ページが読み込まれるときにUIコンポーネントのプロパティを取得または設定する必要があります。ただし、ngOnInit,ngAfterViewInitまたは(オンロード)は動作していないようです。NativeScriptはページが読み込まれたときにUIプロパティを取得または設定できません

この問題を示すためにNativeScriptプログラムを作成しました。このプログラムには2ページあり、各ページには2つのラベルが縦に積み重ねられています。各ページの上のラベルを押すと、プログラムは他のページを読み込みます。コンソールでは、ラベルの幅を印刷します(label.getActualSize().width)。他のページに切り替えると、ラベルの幅が問題なく表示されます。私が得る価値はです。しかし、私が望むのは、ページをロードするときに、コンソールに幅が表示されることです。

私は私の.htmlをファイルからngAfterViewInit()(ロード)を試してみましたが、彼らは動作していないようです。それは私にを与える。私の推測では、NativeScriptはすべてのコンポーネントがロードされる前に幅の値を取得するので、この値が得られます。私はこの問題を解決する必要があります。完全を期すために

import {Component, ViewChild, ElementRef, OnInit} from "@angular/core"; 
import {Router} from "@angular/router-deprecated"; 

import {Page} from "ui/page"; 

import {Label} from "ui/label"; 

@Component({ 
    selector: "page2", 
    templateUrl: "pages/page_2/page_2.html", 
    styleUrls: ["pages/page_2/page_2-common.css", "pages/page_2/page_2.css"] 
}) 

export class Page2 implements OnInit { 

    @ViewChild("label_in_2") label_in_2: ElementRef; 

    constructor(private _router: Router, private page: Page) {} 

    ngOnInit() { 

    } 

    ngAfterViewInit() { 
     let label = <Label>this.label_in_2.nativeElement; 

     console.log("width of the label 2 in ngAfterViewInit: " + label.getActualSize().width); // this gives me 0. 
    } 

    whatisthewidth(testLabel) { 
     // let test = testLabel.nativeElement; 

     // testLabel. 

     console.log("width of the label 2 in whatisthewidth: " + testLabel.getActualSize().width); // this gives me 0. 
    } 

    to_page1() { 
     let label = <Label>this.label_in_2.nativeElement; 

     console.log("width of the label 2: " + label.getActualSize().width); // this gives me 270. 

     console.log("to page 1"); 
     this._router.navigate(["Page1"]); 
    } 

} 

、私はプログラムの他の部分を添付してみましょう:

は、ここでの主なテストの一部が含まれているpage_2.component.ts、のために私のコードです。

main.ts

import {nativeScriptBootstrap} from "nativescript-angular/application"; 
import {AppComponent} from "./app.component"; 

nativeScriptBootstrap(AppComponent); 

app.component.ts

import {Component} from "@angular/core"; 

import {HTTP_PROVIDERS} from "@angular/http"; 
import {RouteConfig} from "@angular/router-deprecated"; 
import {NS_ROUTER_DIRECTIVES, NS_ROUTER_PROVIDERS} from "nativescript-angular/router"; 

import {Page1} from "./pages/page_1/page_1.component"; 
import {Page2} from "./pages/page_2/page_2.component"; 

@Component({ 
    selector: "main", 
    directives: [NS_ROUTER_DIRECTIVES], 
    providers: [NS_ROUTER_PROVIDERS, HTTP_PROVIDERS], 
    template: "<page-router-outlet></page-router-outlet>" 
}) 
@RouteConfig([ 
    { path: "/Page1", component: Page1, name: "Page1" }, 
    { path: "/Page2", component: Page2, name: "Page2", useAsDefault: true } 
]) 

export class AppComponent { } 

app.css

button, label, stack-layout { 
    horizontal-align: center;  
} 

button { 
    font-size: 36; 
} 

.title { 
    font-size: 30; 
    margin: 20; 
} 

.message { 
    font-size: 20; 
    color: #284848; 
    text-align: center; 
    margin: 0 20; 
} 

.button_label { 
    background-color: gray; 

    width: 75%; 
    height: 25%; 
} 

page_1.component.ts

import {Component, ViewChild, ElementRef, OnInit} from "@angular/core"; 
import {Router} from "@angular/router-deprecated"; 

import {Page} from "ui/page"; 

import {Label} from "ui/label"; 

@Component({ 
    selector: "page1", 
    templateUrl: "pages/page_1/page_1.html", 
    styleUrls: ["pages/page_1/page_1-common.css", "pages/page_1/page_1.css"] 
}) 

export class Page1 { 

    @ViewChild("label_in_1") label_in_1: ElementRef; 

    constructor(private _router: Router, private page: Page) {} 

    to_page2() { 
     let label = <Label>this.label_in_1.nativeElement; 

     console.log("width of the label 1: " + label.getActualSize().width); 

     console.log("to page 2"); 
     this._router.navigate(["Page2"]); 
    } 

} 

page_1.html

<StackLayout> 
    <Label text="to page 2" class="button_label" (tap)="to_page2()"></Label> 
    <Label #label_in_1 text="second label" class="test_label"></Label> 
</StackLayout> 

PAGE_1-common.css

Label.test_label { 
    background-color: blue; 

    width: 75%; 
    height: 20%; 
} 

page_2.html

<StackLayout> 
    <Label text="to page 1" class="button_label" (tap)="to_page1()"></Label> 
    <Label #label_in_2 text="second label" class="test_label" (loaded)="whatisthewidth(label_in_2)"></Label> 
</StackLayout> 

page_2.common.css

Label.test_label { 
    background-color: yellow; 

    width: 75%; 
    height: 20%; 
} 

任意のアドバイスや洞察が理解されるであろう。

答えて

0

私は問題がまだ存在している間のGithub上の問題が回避策によって、閉じたと考えられているのか分からない、この質問はthis Githubの問題

2

と関連していると思います。タイムアウトの解決策は、DOMがロードされるまで待つだけです。これは、templateURLからロードされると時間がかかるため、追加する時間がありません。

関連する問題