Получите доступ к системе Aurelia Dependency Injection без использования конструктора
Есть ли способ получить доступ к системе Aurelia Dependency Injection без использования конструктора.
У меня есть класс под названием Box
, Мне нужно знать, когда меняется одно из его свойств, чтобы я мог обновить свою проверку. Я обнаружил, что я могу использовать bindingEngine.propertyObserver
из этого ответа.
Но мои примеры Box
созданы BreezeJs
а не аурелия. Итак, используя @inject
(или же @autoinject
в моем случае), чтобы получить экземпляр bindingEngine
не собирается работать.
Я видел aurelia.container.get
Позвольте мне решить из структуры DI Аурелии. Но для этого нужен текущий экземпляр Aurelia
объект. Единственный способ, которым я могу это увидеть - это инжекция в конструктор!
Итак, чтобы обойти инжекцию конструктора, вам нужно... инъекция конструктора!
Я надеюсь, что я что-то упустил, и есть другой способ получить экземпляр bindingEngine
без инжектора конструктора.
ПРИМЕЧАНИЕ. Сейчас я просто преобразую свою переменную в свойство javascript и самостоятельно запишу измененное событие. Но я знаю, что это приведет меня к грязной проверке...:(
1 ответ
Если вы хотите знать, когда изменяются свойства сущности Breeze, используйте entityAspect.propertyChanged
событие:
http://breeze.github.io/doc-js/api-docs/classes/EntityAspect.html
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; });
Обход конструктора впрыском не рекомендуется. Это нарушает принцип инверсии зависимостей, однако для этого есть механизм:
main.js
export function configure(aurelia) {
aurelia.container.makeGlobal();
...
}
box.js
import {Container} from 'aurelia-dependency-injection';
let bindingEngine = Container.instance.get(BindingEngine);