Чтобы вытолкнуть ваше значение из Subject
, создайте из него Observable
и subscribe
.
Если вы хотите локальную версию значения, вам нужно взять копию из-за того, что объекты передаются по ссылке в JavaScript, поэтому создайте новый объект при подписке.
Вы можете сделать это с помощью Синтаксис распространения .
Затем вы можете присвоить любые значения локальному объекту, которые вам нравятся, без влияния на Subject
.
* 1014. * напр. (
StackBlitz )
const theRuleSbj = new BehaviorSubject<Rule>(null);
const theRule$ = theRuleSbj .asObservable();
// The observable will emit null on the initial subscription
// Subject minght be a better fit
theRule$.subscribe(rule => {
console.log(`Subscription value:`, rule);
// Use object spread to create a new object for your component
this.rule = { ...rule };
});
// Update the Subject, it will console log new value
// and update your local value0
theRuleSbj.next({ name: 'Name 1'});
// Update your local value, does not effect your Subject value
this.rule.name = 'Name 2';
// Confirm that they are differant
console.log(`Subject Value:`, theRuleSbj.getValue());
console.log(`Local Value`, this.rule);
// Be careful as when you update the Subject, your local value will be updated
theRuleSbj.next({ name: 'Name 3'});
console.log(`Subject Value (after subject update):`, theRuleSbj.getValue());
console.log(`Local Value (after subject update)`, this.rule);
Имейте в виду, подписавшись, вы получите все обновления значения субъекта, переведенные на локальное значение, вы можете или не хотите, чтобы это произошло.
Если вам нужно только одно значение в компоненте, вы можете pipe()
observable
и использовать take(1)
, чтобы получить одно значение, но при инициализации Subject
как BehaviourSubject
, вы получите только значение null
. Возможно, вы захотите изменить это значение на Subject
, поэтому, когда первое значение передается на Subject
, ваш компонент получает его.
const theRuleSbj = new Subject<Rule>();
/* other code omitted */
theRule$
.pipe(take(1))
.subscribe(rule => {
console.log(`Subscription value:`, rule);
this.rule = { ...rule };
});