angular - 如何在服务中移动函数?
问题描述
我有这个函数,我用它来改变一个控件的值,这取决于另一个控件的值。由于我在几个组件中使用了这个函数,我想我应该把它移到一个服务中并从那里调用它。问题是我必须订阅 formControl 的 valuechanges。所以我的问题是,
如何重写此函数,以便我可以在服务内部使用它,而无需在服务内部订阅?
这是我的功能:
setDefault(formarray: FormArray, index: number, sourceCtrl:string, targetCtrl:string ) {
formarray.at(index)
.get(sourceCtrl)
.valueChanges
.pipe(takeUntil(this._destroy))
.subscribe(value => {
if (value !== null && value !== "" && value !== undefined) {
formarray.at(index)
.get(targetCtrl)
.setValue(this.default);
} else {
formarray.at(index)
.get(targetCtrl)
.setValue(null);
}
});
}
解决方案
就像jonrsharpe
说你可以返回一个observable
. 无论您在哪里取消订阅,都不应该成为问题,因为每个订阅都是他们自己的。
但是我看到代码中的代码subscribe
也可以重复,所以也许你可以利用面向对象的编程。
创建一个基类:
export class BaseFormClass() {
setDefault(formarray: FormArray, index: number, sourceCtrl:string, targetCtrl:string ) {
formarray.at(index)
.get(sourceCtrl)
.valueChanges
.pipe(takeUntil(this._destroy))
.subscribe(value => {
if (value !== null && value !== "" && value !== undefined) {
formarray.at(index)
.get(targetCtrl)
.setValue(this.default);
} else {
formarray.at(index)
.get(targetCtrl)
.setValue(null);
}
});
}
}
并且任何需要此功能的组件都可以扩展BaseFormClass
。
export class Component1 extends BaseFormClass implements OnInit {
ngOnInit() {
this.setDefault(......);
}
}
推荐阅读
- python - 循环前进的numpy方式
- microsoft-teams - Microsoft Teams Powershell 模块问题
- android - android:constraintLayout中的视图不更新
- python - gunicorn with compiled python source
- ruby-on-rails - 如何在 Rails 中处理权限
- javascript - 为什么 Firefox 在页面重新加载后不显示来自服务器的实际信息?
- bash - 在 bash 脚本中访问环境变量
- javascript - Node.js 将 3D 模型文件发送到客户端进行渲染(Three.js)
- nginx-location - 使用 ingress-nginx 记录 POST 正文(请求和响应)
- python - Python pip 安装