wirejs - новый экземпляр компонента для каждого зависимого компонента

Во-первых: я новый проводник, и вполне возможно, что я что-то пропустил в документах

В обычном объявлении компонента, например:

'Bnaya/App/TrackingService': {
    create: {
        module: 'Bnaya/App/TrackingService',
        args: []
    }
}

Все компоненты, которые будут зависеть от того компонента, использующего $ref, получат один и тот же экземпляр, поэтому провод будет также своего рода одноэлементным механизмом (что хорошо для меня в большинстве случаев)

В некоторых случаях я хочу, чтобы каждый зависимый получал свой экземпляр компонента, используя те же конфигурации компонентов.

'Bnaya/App/TrackingService': {
    create: {
        module: 'Bnaya/App/TrackingService',
        args: [],
        notASingleton: true
    }
}

Я знаю, как получить похожий результат, используя несколько имен компонентов или встроенное создание экземпляров, но это то, чего я пытаюсь избежать.

Спасибо!

1 ответ

Решение

Есть несколько способов создать несколько экземпляров компонентов в wire.js. В зависимости от ваших потребностей вы можете увидеть, какой из них может работать для вас.

Во-первых, вы можете использовать create Фабрика порождает новые экземпляры от прототипа. Когда вы даете create модуль функции или конструктора, он будет вызывать их. Однако, если вы дадите create существующий объект, он будет использовать Object.create создать новый экземпляр, который затем можно настроить как обычно (например, используя properties, init, советы и т. д.). Просто имейте в виду, что это работает так же, как Object.createпоэтому свойства прототипа будут общими.

Во-вторых, вы можете использовать wire Завод для достижения желаемого эффекта. Вам просто нужно обернуть non-singleton в его собственную спецификацию провода. Вот быстрый пример:

thingThatNeedsATrackingService: {
    create: 'my/ThingThatNeedsATrackingService',
    properties: {
        foo: { wire: 'my/trackingServiceSpec' }
    }
},

otherThingThatNeedsATrackingService: {
    create: 'my/OtherThingThatNeedsATrackingService',
    properties: {
        foo: { wire: 'my/trackingServiceSpec' }
    }
},
//... more components

А потом, в my/trackingService.js:

// Export the trackingService instance
$exports: { $ref: 'trackingService' },

trackingService: {
    create: {
        module: 'Bnaya/App/TrackingService',
        args: []
    }
},
//... more components if you need

Это введет новый экземпляр Bnaya/App/TrackingService в каждую из двух вещей, которые нуждаются в одной. $exports позволяет экспортировать определенный компонент или компоненты из спецификации провода, так же, как CommonJS exports,

Этот подход имеет несколько приятных преимуществ в том, что вы можете настроить "частные" компоненты внутриmy/trackingService.js и они также будут созданы по мере необходимости, но только trackingService будет видно С другой стороны, иногда немного сложнее разделить подобный прототип компонента в его собственной спецификации проводов.

Следующая версия wire.js будет поддерживать другие типы областей действия компонентов, что упростит некоторые случаи.

Другие вопросы по тегам