@@ -469,30 +469,51 @@ export class Binding {
469
469
let parentViewAndIndex : { view : ViewBase , index : number } ;
470
470
let parentView ;
471
471
let addedProps = newProps || [ ] ;
472
- if ( expression . indexOf ( bc . bindingValueKey ) > - 1 ) {
472
+ let expressionCP = expression ;
473
+ if ( expressionCP . indexOf ( bc . bindingValueKey ) > - 1 ) {
473
474
model [ bc . bindingValueKey ] = model ;
474
475
addedProps . push ( bc . bindingValueKey ) ;
475
476
}
476
477
477
- if ( expression . indexOf ( bc . parentValueKey ) > - 1 ) {
478
- parentView = this . getParentView ( this . target . get ( ) , bc . parentValueKey ) . view ;
479
- if ( parentView ) {
480
- model [ bc . parentValueKey ] = parentView . bindingContext ;
481
- addedProps . push ( bc . parentValueKey ) ;
482
- }
483
- }
478
+ let success : boolean = true ;
484
479
485
- let parentsArray = expression . match ( parentsRegex ) ;
480
+ let parentsArray = expressionCP . match ( parentsRegex ) ;
486
481
if ( parentsArray ) {
487
482
for ( let i = 0 ; i < parentsArray . length ; i ++ ) {
483
+ // This prevents later checks to mistake $parents[] for $parent
484
+ expressionCP = expressionCP . replace ( parentsArray [ i ] , "" ) ;
488
485
parentViewAndIndex = this . getParentView ( this . target . get ( ) , parentsArray [ i ] ) ;
489
486
if ( parentViewAndIndex . view ) {
490
487
model [ bc . parentsValueKey ] = model [ bc . parentsValueKey ] || { } ;
491
488
model [ bc . parentsValueKey ] [ parentViewAndIndex . index ] = parentViewAndIndex . view . bindingContext ;
492
489
addedProps . push ( bc . parentsValueKey ) ;
493
490
}
491
+ else
492
+ {
493
+ success = false ;
494
+ }
494
495
}
495
496
}
497
+
498
+ if ( expressionCP . indexOf ( bc . parentValueKey ) > - 1 ) {
499
+ parentView = this . getParentView ( this . target . get ( ) , bc . parentValueKey ) . view ;
500
+ if ( parentView ) {
501
+ model [ bc . parentValueKey ] = parentView . bindingContext ;
502
+ addedProps . push ( bc . parentValueKey ) ;
503
+ }
504
+ else
505
+ {
506
+ success = false ;
507
+ }
508
+ }
509
+
510
+ // For expressions, there are also cases when binding must be updated after component is loaded (e.g. ListView)
511
+ if ( ! success )
512
+ {
513
+ let targetInstance = this . target . get ( ) ;
514
+ targetInstance . off ( "loaded" , this . loadedHandlerVisualTreeBinding , this ) ;
515
+ targetInstance . on ( "loaded" , this . loadedHandlerVisualTreeBinding , this ) ;
516
+ }
496
517
}
497
518
498
519
private getSourcePropertyValue ( ) {
0 commit comments