こんにちはダートと角皆さん、 を更新していないバインディング:Angular2ダーツプロパティは問題以下
私はapp_component.dartカスタムコンポーネントのテンプレートである私のapp_component.html、中に以下のテンプレートの一部を持っています。
<!-- monitoring active breakpoints-->
<jb-responsive-breakpoints [breakpoints]="breakpoints"
[(activeBreakpoints)]="activeBreakpoints">
</jb-responsive-breakpoints>
<!-- using list of active breakpoints -->
<jb-menu [activeBreakpoints]="activeBreakpoints">
<!--some menu items, irrelevant for this problem-->
</jb-menu>
<!-- testing list of active breakpoints-->
Active Breakpoints:
<ul>
<li *ngFor="let breakpoint of activeBreakpoints;"> {{breakpoint}}</li>
</ul>
Jbの応答性 - ブレークポイントとJB-メニューもカスタムコンポーネントです。以下のulは、jb-responsive-breakpointの適切な機能をテストします。
変数「ブレークポイント」と、このテンプレートで使用される「activeBreakpointsは」次のコードでapp_component.dart内で定義されています。
//Mapping from window min-width for this breakpoint to label
Map<int, String> breakpoints = {0:'small', 310:'medium', 450:'large', 600:'xlarge'};
List<String> activeBreakpoints = new List<String>();
何が起こる必要があります。
- JB応答性、ブレークポイント指定された幅のリスナーを登録する
- ウィンドウの現在の幅が1つのブレークポイントを超えると、 "activeBreakpoints"リストが更新されます。このリストには、現在アクティブなブレークポイントがすべて含まれています.cssは、一致するすべてのメディアクエリを一度に有効にします。
- これは、テンプレートのulがそれに応じて更新されるためです。
問題:
JB-メニューは、それの外観を変更する際に、把握するactiveBreakpointsのリストを取得する必要があります。 jb-menuのactiveBreakpointsプロパティは、イベントハンドラのように設定されます。
JB-メニューのactiveBreakpointsプロパティは次のように定義されています。
List<String> _activeBreakpoints;
@Input()
set activeBreakpoints(List<String> breakpoints) {
_log.finest("ActiveBreakpoints list changed");
_log.finest("Active Breakpoints: ${breakpoints.fold("", (prevVal, elem) => "$prevVal, $elem")}");
_activeBreakpoints = breakpoints;
}
get activeBreakpoints {
return _activeBreakpoints;
}
行動: - セッターは空のリストと呼ばれている - ので、初期 の論理 - いいえ、セッターがさらにブレークポイントの変更で呼び出されません(ログメッセージでこれを証明できます - ウィンドウのサイズを変更するときに "activeBreakpoints changed"ログメッセージなし) - 混乱:ngAfterViewInit
のjb-menuコンポーネントにアクティブなブレークポイントを記録すると、現在のブレークポイントはすべて意図通りに表示されます:
@override
ngAfterViewInit() {
_log.finest(
'''
currentBreakpoints: $activeBreakpoints
'''
);
}
これが生成します。
currentBreakpoints: [small, medium, large, xlarge]
または少ないブレークポイントを、ウィンドウサイズに応じました。
これは、両方のコンポーネントで同じリスト参照が使用されているためです。
しかし、私のメニューコンポーネントは、イベントハンドラのように呼び出されるセッターに依存しています。
いくつかのアイデアを修正する方法はありますか?
PS:詳しいコードや説明が必要な場合は、お問い合わせください。:)
まず、本当に大きな感謝!:) さて、私は参照を比較する点を参照してください。いくつかのテストの後、* ngForはあなたが言及している3番目のメソッドを使用しているように見え、したがって動作します。 しかし、わかりません、IterableDiffersの使い方は少しありますか?私は検索してオートコンプリートで試しましたが、使用法は私には意味がありません:D jb-menuのセッターを通常のパブリック "変数"に変更すると、値は完全に表示されます。しかし、私はこれらの値でいくつかのチェックをしなければならないので、単純なバインディングはオプションではありません。 ---次のコメントに続きます--- –
さて、 'jb-responsive-breakpoints'の中で' .toList() 'を使ってactiveBreakpointsの新しいインスタンスを作ってみましょう。しかし、これは少しハッキーだと思いますか? この「DoCheck」メソッドと「terableDiffers」メソッドを使用する方が効果的かもしれませんか? –
あなたはまだ書いていますか? :D https://angular.io/docs/ts/latest/api/core/index/DoCheck-class.htmlには例があります。 "public変数"についてわからない –