Получите доступ к системе 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);
Другие вопросы по тегам