2016-03-25 9 views
3

Gibt es eine Möglichkeit, Zugang zu Aurelia Dependency Injection System ohne Konstruktor Injektion zu erhalten.Zugang zu Aurelia Dependency Injection System ohne Konstruktor Injektion

Ich habe eine Klasse namens Box. Ich muss wissen, wann sich eine seiner Eigenschaften ändert, damit ich meine Validierung aktualisieren kann. Ich habe festgestellt, dass ich bindingEngine.propertyObserver von diesem answer verwenden kann.

Aber meine Instanzen von Box werden von BreezeJs, nicht Aurelia erstellt. Also mit @inject (oder @autoinject in meinem Fall), um die Instanz bindingEngine zu bekommen, wird nicht funktionieren.

Ich sah aurelia.container.get wird mich von Aurelias DI-Framework lösen lassen. Aber das benötigt die aktuelle Instanz des Objekts Aurelia. Die einzige Möglichkeit, das zu sehen, ist ... Konstruktorinjektion!

Also, um Konstruktor Injektion zu umgehen, müssen Sie ... Konstruktor Injektion!

Ich hoffe, ich vermisse etwas und es gibt eine andere Möglichkeit, eine Instanz von bindingEngine ohne Konstruktor Injektion zu bekommen.

HINWEIS: Im Moment werde ich einfach meine Variable in eine JavaScript-Eigenschaft konvertieren und ein geändertes Ereignis selbst auslösen. Aber ich weiß, dass dies mir zu schmutzig Überprüfung bewegen wird ... :(

Antwort

5

Wenn Sie wissen möchten, wann eine Brise Unternehmens Eigenschaften ändern, verwenden Sie das entityAspect.propertyChanged Ereignis:

http://breeze.github.io/doc-js/api-docs/classes/EntityAspect.html#event_propertyChanged

order.entityAspect.propertyChanged.subscribe(
function (propertyChangedArgs) { 
    // this code will be executed anytime a property value changes on the 'order' entity. 
    var entity = propertyChangedArgs.entity; // Note: entity === order 
    var propertyNameChanged = propertyChangedArgs.propertyName; 
    var oldValue = propertyChangedArgs.oldValue; 
    var newValue = propertyChangedArgs.newValue; 
}); 

Umgehen Konstruktor Injektion wird nicht empfohlen, es verstößt gegen die dependency inversion principle, aber es ist ein Mechanismus dafür ist so:.

main.js

export function configure(aurelia) { 
    aurelia.container.makeGlobal(); 
    ... 
} 

box.js

import {Container} from 'aurelia-dependency-injection'; 

let bindingEngine = Container.instance.get(BindingEngine); 
+0

Vielen Dank! Sie haben recht, wenn Sie die Änderungsbenachrichtigung von Brise verwenden. (Ich war einfach so in Aurelias System, das habe ich vergessen. Nochmals vielen Dank! – Vaccano

+0

Ist es schlecht, die 'BindingEngine' anstelle von Breeys System zu verwenden? Ich habe die Binding Engine verdrahtet und es hat super geklappt. Ich denke ich bevorzuge die' BindingEngine' persönlich , aber wenn es ein Grundsystem der Brise gibt, würde ich es gerne wissen. " – Vaccano

+0

Wenn Sie aurelia-breeze verwenden, verwendet das Bindungssystem das Brise-System, so dass Sie indirekt das Brise-System verwenden. Ich würde mit dem Eingeborenen gehen Es vermeidet das schlechte Muster der Umgehung der Konstruktorinjektion. –