- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
长话短说
我们正在使用 Angular 2 构建一个应用程序,并希望注册一个“全局”ngOnInit
和 ngOnDestroy
函数。对于“全局”,我的意思是为每个组件执行该功能,而不需要为每个组件显式实现。这可能吗?
详细
我们的一些(但不是全部)组件需要在加载后在全局服务中注册一些东西(例如 ngOnInit
),并在卸载后再次取消注册(例如 ngOnDestroy
)。以下是我能想到的两种方法:
ngOnInit
和 ngOnDestroy
中)。这两种方法都不太令人满意:
这就是为什么我想出了以下想法:
为什么不将上面提到的抽象类替换为可以由所有必需组件实现的接口(interface)。然后我会注册一个全局函数,该函数在所有组件的每个 ngOnInit
和 ngOnDestroy
上执行(如果可能 - 例如在模块、路由等中?)。在函数中,我将检查组件是否实现了接口(interface),如果实现了,则调用适当的函数来获取要注册的特定类型的内容。
我的问题
最佳答案
强制整个应用的行为不是一个好主意,这会影响第三方组件以及初学者。
样板代码可以移动到具体的基类中。有针对 JS/TS 多重继承的解决方案,例如@mixin ,另见 TypeScript guide .
由于基类方法是固定的,类mixin可以表示为一个简化的装饰器:
class CustomLifecycle implements OnInit, OnDestroy {
constructor(
public originalNgOnInit: Function,
public originalNgOnDestroy: Function
) {}
ngOnInit() {
...
if (typeof this.originalNgOnInit === 'function') {
this.originalNgOnInit();
}
}
ngOnDestroy() {
...
if (typeof this.originalNgOnDestroy === 'function') {
this.originalNgOnDestroy ();
}
}
}
function Lifecycled() {
return function (target: Function) {
const customLifecycle = new CustomLifecycle(
target.prototype.ngOnInit,
target.prototype.ngOnDestroy
);
target.prototype.ngOnInit = customLifecycle.ngOnInit;
target.prototype.ngOnDestroy = customLifecycle.ngOnDestroy;
}
}
它可以像这样使用
@Component({ ... })
@Lifecycled()
class SomeComponent { .... }
实现仅限于ngOnInit
等原型(prototype)方法,箭头成员需要打补丁的构造函数。
关于 Angular 2 : "Global" lifecycle hooks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39420241/
Flutter 项目无法在带有 AndroidX 的 Android Studio 中运行兼容性并在运行/控制台窗口中返回以下错误: FAILURE: Build failed with an exc
2019年5月7日,androidx.Life Cycle:*:2.2.0-alpha01发布,宣布:。在文档中提到,我可以获得LifecycleScope:。但是我好像一个也找不到。我目前的依赖关系
我正在尝试使用 Android 生命周期,但我正在添加生命周期编译器依赖项。 这是模块 build.gradle, apply plugin: 'com.android.application' ap
有什么区别 android.arch.lifecycle vs androidx.lifecycle 代码: val loading: LiveData get() = webDataSour
在真实设备上(Nexus 5、Leeco、小米等).observe 方法有效,但是当我在 Firebase 测试实验室开始测试时,应用程序在很多设备上启动时崩溃并出现异常(虚拟 Nexus 10 和
我正在尝试观察 的结果查看收集和上游流停止 . 但是viewModel.testFlow应用程序在后台时仍在收集。 为什么我无法观察到收集已停止?我观察到什么不对吗? View 模型: val tes
我们的 Activity/Fragment 中已经有一个生命周期,那么为什么我们要使用生命周期感知组件并请指导我它的主要目的。如果我们使用生命周期感知,那么为什么我们使用我们已经知道的生命周期 最佳答
我在尝试实现 viewpager2 时收到此错误 相关代码如下: public class ViewPagerAdapter extends FragmentPagerAdapter { privat
目前,我们正在项目中使用LiveData、ViewModel 和Room。 我们正在使用 Java 8。 我们在build.gradle中使用以下内容 // ViewModel and LiveDat
2019 年 5 月 7 日 androidx.lifecycle:*:2.2.0-alpha01 发布公告: This release adds new features that adds sup
正在制作有关 LiveData 和 ViewModel 的教程。在 build.gradle 中我添加了: // ViewModel and LiveData implementation "andr
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
我在我的 Android 应用程序中重载了应用程序类,我正在使用 ACRA报告系统。我的应用看起来像 ( real source code here) : public class MyApplica
我的公司有一个最初为 Windows XP 开发的桌面应用程序。最初的程序员已经被解雇了(我可能会因极端偏见而被解雇)。我已经多次修复了该应用程序,但总体上尽量避免它,它是一团糟,修复它的唯一真正方法
我是架构组件的新手,我创建了一个 ViewModel 类并根据架构组件实现了 LifecycleObserver,在 ViewModel 类中我有一个可运行接口(interface)的重写 run()
在 mvvmcross v3 ViewModel public class TimerViewModel : MvxViewModel { System.Timers.Timer timer;
那么,我们来谈谈 React 组件的生命周期。 我的模型文件名为 Firebase.js ,里面有我所有的方法都可以触发我的数据。 Firebase.js export const getUserSh
我想知道 Storm Spout 上的各种方法何时被调用。 我看过ISpout javadoc ,这给了我以下思维模型: "instantiated" -- open(...) -----> "act
我有一个问题,我认为它与屏幕渲染及其生命周期有关。基本上我有两个屏幕(菜单和游戏)。在 GameScreen 渲染方法中,我调用 World.update,然后调用我的 Render。在(GameSc
我在使用 reactjs 时遇到了很多问题,主要是因为我不确定组件生命周期以及 确切地 setState 之类的东西在什么时候做事。 我知道有一个标题为“组件生命周期”的页面,但我需要一个更详细的可视
我是一名优秀的程序员,十分优秀!