2017-02-05 14 views
0

コンポーネントから別のコンポーネントにデータを転送しようとしているAngular v1.6.1の問題に苦しんでいます。Angular v1コンポーネントからコンポーネントへのデータ転送


Iは、サービスからデータをフェッチコントローラを有するapp\common\navbarに存在ナビゲーションバーと呼ばれる成分を有します。以下のファイルは、ナビゲーションバーのコンポーネント

navbar.component.js

import controller from './navbar.controller'; 
import template from './navbar.html'; 
export default navbarComponent = { 
    restrict: 'E', 
    bindings: {}, 
    template, 
    controller 
}; 

navbar.controller.js

class NavbarController { 
    constructor(httpService) { 
    const dataUrl = "/assets/data/header.json"; 
    this.name = 'Navbar'; 
    this.headerData = {}; 
    console.log("In "+this.name); 
    httpService.getData(dataUrl) 
     .then((response) => { 
      angular.extend(this.headerData,response.data); 
     },(error) => { throw error; }); 
    } 
} 
export default NavbarController; 

navbar.html

<section> 
    <top-header top-data="$ctrl.headerData"></top-header> 
<section> 
を作ります

と私のhttpServiceapp\servicesフォルダにあります。それはaxios HTTPライブラリを使用してコンテンツをフェッチし、この

httpService.js

import axios from 'axios'; 
export class HttpService { 
    constructor() { 
     this.name = "HttpService"; 
    } 
    getData(api_url){ 
     return axios.get(api_url) 
     .then((response) => response, (error) => error); 
    } 
} 

navbarコンポーネントのheaderDataはトップヘッダで使用し、app\common\top-headerにあるコンポーネントのようになります。これは、

トップheader.component.jsが含まれているものです

import template from './top-header.html'; 
import controller from './top-header.controller'; 

export default topHeaderComponent = { 
    restrict: 'E', 
    template, 
    bindings: { 
     topData: '<' 
    }, 
    controller, 
}; 

トップheader.controller.js

class TopHeaderController { 
    constructor() { 
    this.name = 'TopHeader'; 
    this.topHeaderData = {}; 
    this.$onInit = function() { 
     this.topHeaderData = this.topData; 
     console.log(this.topHeaderData); 
     console.log(this.topHeaderData.telephoneNumber); 
     console.log(this.topHeaderData); 
    } 
    } 
} 
export default TopHeaderController; 

トップheader.html

{{$ctrl.topHeaderData.telephoneNumber}} 

、最終的には私の静的ファイルはassets\dataに常駐し、私はheader.jsonを取得しようとしているJSONは

header.json

{ 
    "telephoneNumber": 12345678 
} 

だから、問題が含まれています今すぐデータがトップヘッダーのコンポーネントに表示されますが、何が起きているのかわかりませんが、データが消える(undefined)オブジェクトプロパティにアクセスします。

私が言っているのは、top-header.controllerです。JS 私は問題は、指令の実行優先順位の存在だと思う、それはオブジェクトを示していますが、私はconsole.log(this.topHeaderData.telephoneNumber);しようとすると、それはundefined

まで来console.log(this.topHeaderData);。私はさらにnavbarを5に設定し、データが定義されていないので助けになりませんでした。私は私のテンプレートでこれを使うよう

トップheader.controller.js

this.$onInit = function() { 
    this.topHeaderData = this.topData; 
    console.log(this.topHeaderData); // shows topData 
    console.log(this.topHeaderData.telephoneNumber); // undefined 
    console.log(this.topHeaderData); // shows topData 
} 

このデータは、this.topHeaderData.telephoneNumber不可欠です。

この問題を解決するにはどうすればよいですか?どんな助けでも大歓迎です。

答えて

0

問題がtop-header.controller.jsであってもよい:あなたは$onInitフックにthis.topheaderDatatopDataをバインドさが、コンポーネントが初期化されたときにデータがまだフェッチされていない代入しています。 -

$ onChanges(changesObj):代わりに$onInitの(データはサーバーから取得されたときに、あなたのケースで)あなたは

角度成分のドキュメントをバインドさプロパティが更新されたときに角度によって呼び出され$onChangeフックメソッドを使用する必要があります片方向バインディングが更新されるたびに呼び出されます。 changesObjは、変更されたバインドされた プロパティの名前をキーとするハッシュであり、値は {currentValue、previousValue、isFirstChange()}という形式のオブジェクトです。バインドされた値を にクローニングするなど、コンポーネント内のトリガーの更新にこのフックを使用すると、外側の値が誤って変更されるのを防ぐことができます。

関連する問題