gpt4 book ai didi

durandal 激活器 - 如何创建一个在加载或首次使用时实现 activate() 的模块

转载 作者:行者123 更新时间:2023-12-02 04:32:09 24 4
gpt4 key购买 nike

读完有关激活器的文档后,我仍然对如何使用激活器感到困惑。我想做的很简单:

我定义了一个名为 global 的 requireJS 模块。当我在其他模块中使用此模块时,不会调用它的激活函数。我确实需要它。

如果我使用 compose: 加载模块,激活函数就会正常触发。但如果我只是将其作为 AMD 模块加载,它们就不会。这就是我想要解决的问题。

注意:我的模块是单例,实际上我只需要激活一次即可运行,所以我尝试了这样的方法,但不起作用,我的 shell.js

define(['plugins/router', 'durandal/app', 'plugins/ajax','durandal/global'], function (router, app,ajax,global) {

var vm = {};

vm.global = global;

vm.activate= function () {
return vm.rebuildRouter();

//not sure what this does, does it return a promise, does it run global's activate, does it hook up global so it activates at a later time, and if so when?
global.activator.activateItem(global); //I created an activator and called in activator inside global. Since its a singlton I think I only need one?

//Since I wasn't sure how to use activators I had to do this instead:
var promise = global.activate();
return promise;

//which works only the first time
}

如果有人可以向我解释这个激活器业务,我将不胜感激。我一直将 activate 与 compose 结合使用,这按照我想要的方式工作。我只是不明白我需要做什么才能让它像上面描述的那样工作,并且找不到一个简单的例子来展示如何让任何 js 模块以相同的方式运行。

最佳答案

activator是一个特殊的计算观察,其写入函数强制 activation lifecycle当它的值试图改变时。

激活生命周期

  1. canDeactivate 根据当前值调用
  2. canActivate 在尝试设置的值上调用
  3. 根据当前值调用deactivate
  4. activate 在尝试设置的值上被调用

使用激活器可以强制某些对象在其值发生变化时触发这些事件,并在 canDeactivatecanActivate 返回 false< 时阻止更改.

听起来您不需要激活器。您并不是试图强制根据这些规则发生值更改,而是试图确保模块在使用之前执行某些逻辑。它只需要执行此逻辑一次,因为它是单例。

不幸的是,RequireJS 没有提供(据我所知)等待模块执行异步工作的方法。

这是你可以做的一件事。由于 Durandal 的 app.start 初始化是一个异步过程,因此您可以 Hook 它,以便在 global 初始化之后调用 setRoot

全局文件

define(['durandal/app', 'plugins/ajax', 'durandal/global'], function (app,ajax) {
return function GlobalModule() {
activate: function() {
return //some promise;
}
};
});

Main.js

define(['durandal/system', 'durandal/app', 'durandal/global'],
function (system, app, global) {
app.configurePlugins({ /* plugins */ });

app.title = 'App';
app.start()
.then(global.activate)
.then(function () {
app.setRoot('shell');
});
});

这将确保 setRootglobal 完成激活之前不会启动。然后,在您的任何应用代码中使用它都应该是安全的。

请记住,我不知道 durandal/global 是什么,并且这项工作依赖于 activate 作为 promise 返回函数。

关于durandal 激活器 - 如何创建一个在加载或首次使用时实现 activate() 的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22793692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com