Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular Rxjs行为主题值更改而不调用next_Angular_Rxjs_Behaviorsubject - Fatal编程技术网

Angular Rxjs行为主题值更改而不调用next

Angular Rxjs行为主题值更改而不调用next,angular,rxjs,behaviorsubject,Angular,Rxjs,Behaviorsubject,假设我的服务中有一个行为主体: theRuleSbj = new BehaviorSubject<Rule>(null); 然后,如果我更改本地规则对象中的某些数据。例如: this.rule.name = 'name'; 我的行为主题值也改变了,不打下电话!我的变量似乎绑定到了行为主体,因此局部变量中的每一个更改都会影响我的行为主体。 这是主体行为吗!!??还是我做错了什么?假设我不想在更改局部变量时更改行为主题 更新: 我在有标记的答案中测试了解决方案,它可以与一个简单的对象

假设我的服务中有一个行为主体:

theRuleSbj = new BehaviorSubject<Rule>(null);
然后,如果我更改本地规则对象中的某些数据。例如:

this.rule.name = 'name';
我的行为主题值也改变了,不打下电话!我的变量似乎绑定到了行为主体,因此局部变量中的每一个更改都会影响我的行为主体。 这是主体行为吗!!??还是我做错了什么?假设我不想在更改局部变量时更改行为主题

更新:


我在有标记的答案中测试了解决方案,它可以与一个简单的对象一起工作。但实际上,就像我的情况一样,如果对象中有嵌套的对象,这是不起作用的,我发现其中的深度复制术语非常适合我。

这是因为BehaviorSubject会返回指向其当前值的链接。当你做这样的事情时

this.rule.name = 'name';
对象属性值更改,但每个人共享的链接仍然相同。 如果您需要在本地更改规则值,请尝试

this.rule = {...this.rule, {name: name}}

它在不更改源值的情况下覆盖本地链接这是因为BehaviorSubject会向您返回指向其当前值的链接。当你做这样的事情时

this.rule.name = 'name';
对象属性值更改,但每个人共享的链接仍然相同。 如果您需要在本地更改规则值,请尝试

this.rule = {...this.rule, {name: name}}

它覆盖本地链接而不更改源值

对象属性在Javascript中通过引用传递。有关更多详细信息,请参阅。也就是说,使用getValue访问可观察对象并不是那么优雅。您可以订阅以获取值,而无需修改源

服务

theRuleSbj=新行为SubjectNull; ruleObs=this.theRuleSbj.a可观测; 组成部分

this.ruleService.ruleObs.subscriberule=>{this.rule=rule};
对象属性在Javascript中通过引用传递。有关更多详细信息,请参阅。也就是说,使用getValue访问可观察对象并不是那么优雅。您可以订阅以获取值,而无需修改源

服务

theRuleSbj=新行为SubjectNull; ruleObs=this.theRuleSbj.a可观测; 组成部分

this.ruleService.ruleObs.subscriberule=>{this.rule=rule};
为了让你的价值从主题中释放出来,所以从主题中创建一个可观察的并订阅

如果您想要该值的本地版本,则需要复制,因为JavaScript中的对象是通过引用传递的,所以在订阅时创建一个新对象

你可以用它来做这件事

然后,您可以在不影响主体的情况下为本地对象指定任何值

e、 g

const theRuleSbj=新行为主体空; const theRule$=theRuleSbj.a可观测; //可观察对象将在初始订阅时发出null //这个主题可能更合适 规则$.subscriberule=>{ log`Subscription value:`,规则; //使用对象排列为组件创建新对象 this.rule={…rule}; }; //更新主题,它将控制台记录新值 //并更新您的本地值 theRuleSbj.next{name:'name 1'}; //更新您的本地值,不影响您的主题值 this.rule.name='name 2'; //确认它们是不同的 log`Subject Value:`,theRuleSbj.getValue; console.log`Local Value`,this.rule; //请小心,因为当您更新主题时,您的本地值将被更新 theRuleSbj.next{name:'name 3'}; log`Subject更新后的Subject值:`,theRuleSbj.getValue; console.log“主题更新后的本地值”,this.rule; 请注意,订阅后,您将获得主题值推送到本地值的所有更新,您可能希望也可能不希望发生这种情况

如果您只需要组件中的一个值,那么您可以通过管道传递可观察值,并使用take1获取一个值,但是当您将主题初始化为BehaviousSubject时,您将只获得空值。您可能希望将其更改为主题,以便在将第一个值推送到主题时,组件将接收该值

const theRuleSbj=新科目; /*省略其他代码*/ 规则$ .喉管1 .subscriberule=>{ log`Subscription value:`,规则; this.rule={…rule}; };
为了让你的价值从主题中释放出来,所以从主题中创建一个可观察的并订阅

如果您想要该值的本地版本,则需要复制,因为JavaScript中的对象是通过引用传递的,所以在订阅时创建一个新对象

你可以用它来做这件事

然后,您可以在不影响主体的情况下为本地对象指定任何值

e、 g

const theRuleSbj=新行为主体空; const theRule$=theRuleSbj.a可观测; //可观察对象将在初始订阅时发出null //这个主题可能更合适 规则$.subscriberule=>{ log`Subscription value:`,规则; //使用对象排列为组件创建新对象 this.rule={…rule}; }; //更新主题,它将控制台记录新值 //并更新您的本地值 theRuleSbj.next{name:'name 1'}; //更新您的本地值,不影响您的主题值 this.rule.name='name 2'; //确认它们是不同的 log`Subject Value:`,theRuleSbj.getValue; console.log`Local Value`,this.rule; //请小心,因为当您更新主题时,您的本地值将被更新 theRuleSbj.next{name:'name 3'}; log`Subject更新后的Subject值:`,theRuleSbj.getValue; console.log“主题更新后的本地值”,this.rule; 请注意,订阅后,您将获得主题值推送到本地值的所有更新,您可能希望也可能不希望发生这种情况

如果您只需要组件中的一个值,那么您可以通过管道传递可观察值,并使用take1获取一个值,但是当您将主题初始化为BehaviousSubject时,您将只获得空值。您可能希望将其更改为主题,以便在将第一个值推送到主题时,组件将接收该值

const theRuleSbj=新科目; /*省略其他代码*/ 规则$ .喉管1 .subscriberule=>{ log`Subscription value:`,规则; this.rule={…rule}; };
谢谢你的回复。你的回答确实有助于我理解正在发生的事情。特别是你在回答中提供的链接。现在,我知道问题出在哪里了,但你的解决方案对我不起作用。我的意思是,即使我用我的行为主体声明了一个新的可观察对象,问题仍然存在。正如您答案中的链接所指出的,如果我按如下属性更改对象:this.rule.name='name',主题将更改,但如果我更改整个对象:this.rule={name='name'},行为主题将不会更改。感谢您的回复。你的回答确实有助于我理解正在发生的事情。特别是你在回答中提供的链接。现在,我知道问题出在哪里了,但你的解决方案对我不起作用。我的意思是,即使我用我的行为主体声明了一个新的可观察对象,问题仍然存在。正如您答案中的链接所指出的,如果我按如下属性更改对象:this.rule.name='name',主题将更改,但如果我更改整个对象:this.rule={name='name'},行为主题将不会更改。感谢您的回复。这对我来说很有效,通过@Micheal D answer,我明白了到底发生了什么。谢谢你的回复。这对我很有效,通过@Micheal D answer,我明白了到底发生了什么。谢谢你的回复和努力。您的解决方案是可行的,但正如我在更新中所述,我的行为主题中有一个嵌套对象,因此扩展语法对我不起作用。我找到了适合我的“深度复制”解决方案。感谢您的回复和努力。您的解决方案是可行的,但正如我在更新中所述,我的行为主题中有一个嵌套对象,因此扩展语法对我不起作用。我找到了适合我的“深度复制”解决方案。