2016-11-24 7 views
2

Ich aktualisiere eine Angular 1.5 App nach the upgrade guide. So habe ich Bootstrap einen Hybrid-App, die UpgradeAdapter und umgesetzt meine Komponenten in Angular 2. Die Komponenten kommunizieren über ein SharedService ähnlich wie this suggestion verwenden.Wie kommuniziert man zwischen Komponenten in der Angular Hybrid App?

jedoch eine Komponente mit einer Angular 1 Richtlinie, die wie einige Ereignisse aussendet:
$scope.$emit('somethingHappened')

In meinem index.ts:

angular.module('myModule', [ 
     require('my-ng1-directive') 
     //... 
]) 
//... 
.component('myNg1Component', { 
     template: '<my-ng1-directive address="{{$ctrl.address}}"></my-ng1-directive>', 
     bindings: { 
      address: '@' 
     } 
}) 

Die Richtlinie aktualisiert und an die Wurzel gegeben Modul meiner App:

@NgModule({ 
    imports: [ 
     //... 
    ], 
    declarations: [ 
     upgradeAdapter.upgradeNg1Component('myNg1Component') 
    ], 
    providers: [ 
     SharedService 
    ] 
}) 
export class AppModule { } 

Irgendwo in meiner Angular 2 Komponente Vorlage:

<my-ng1-component address="{{someAddress}}"></my-ng1-component> 

Diese Komponente muss auf diese Ereignisse hören. Normalerweise würde ich nur:

$scope.$on('somethingHappened', function() { 
    // do something 
}) 

Wie kann ich auf die Ereignisse hören, emittiert von einer Angular 1 Richtlinie in einem Winkel 2-Komponenten?

Da es in Angular 2 keine $scope gibt, frage ich mich, ob das überhaupt möglich ist?

+0

Haben Sie mit @Input() Bindungen zur Winkel 1 Richtlinie Ereignis versucht hören? Nicht sicher, ob das funktioniert. Refactor um das Event auch über den Shared Service zu übergeben? – RobSeg

+0

Sie können genauer erklären, was Sie meinen? Ich verstehe es nicht ganz. Ich könnte versuchen, die Veranstaltung über den SharedService zu übergeben, aber ich möchte es modular halten. 'my-ng1-directive' ist als eigenes Modul gekapselt und sollte den' sharedService' überhaupt nicht kennen. – lenny

+1

Ich bin mir nicht sicher, ob das möglich ist. Ich würde vorschlagen, bei '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'zu verweilen oder Event-Emitter-Instanzen durch Binding zu übergeben. – estus

Antwort

3

eine Lösung gefunden.

Dank @estus für den Hinweis.

index.ts

angular.module('myModule', [ 
     require('my-ng1-directive') 
     //... 
]) 
//... 
.component('myNg1Component', { 
     template: '<my-ng1-directive address="{{$ctrl.address}}" on-something-happened="$ctrl.somethingHappened()"></my-ng1-directive>', 
     bindings: { 
      address: '@', 
      onSomethingHappened: '&' 
     }, 
     controller: function() { 
      this.somethingHappened = function() { 
       this.onSomethingHappened(); // "trigger" the output 
      }; 
     } 
}) 

Verwenden Ausgangsbindungen in myNg1.directive.js

// ... 
bindToController: { 
    address: '@', 
    onSomethingHappened: '&' 
}, 
controller: function() { 
    // "trigger" the output somewhere in the controller 
    this.onSomethingHappened(); 
} 

Mit dem myNg1Component in Angular 2 -Komponente Vorlage (Bekanntmachung die Angular 2-Notation des Out setzen Bindung)

<my-ng1-component address="{{someAddress}}" (onSomethingHappened)="doSomething()"></my-ng1-component> 
Verwandte Themen