问题标签 [module-pattern]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 回复:jQuery;将全局 ajax 事件绑定到非 DOM 对象
这里的基本模块问题:如果我放弃我的模块模式,我可以让全局处理程序正常工作,但是这个测试代码不起作用,我很难弄清楚为什么:
执行 ajax 调用时,附加到MyModule
实例的处理程序永远不会运行。如果我改为将处理程序附加到$(document)
它就可以了,但我很好奇为什么该全局事件似乎没有正确绑定到模块对象。
编辑:这是一个更简单的例子:
如果我替换$(x)
为$(document)
,它可以工作......似乎我无法将ajaxStart
(或其他全局 ajax 事件)绑定到非 DOM 对象?
@Nucleon,这对我来说似乎并不完全正确,这里有一个例子说明原因:
在这里,(自定义)事件“foo”通过两种模式绑定,并且不同的触发方法显示模式特异性......您将获得两次“普通”警报和一次“速记”警报。
$.event.trigger("foo")
现在,您还可以使用(但是,不存在等效的全局)来触发全局事件triggerHandler
。问题是如果您将此代码添加到末尾:
两个处理程序都不会针对此全局事件触发运行。
但是,如果您item
用一些 DOM 类型的元素替换 - 正如您在上面建议的那样 - 那么本地和全局事件都会被处理,但需要注意的是“速记”处理程序现在不起作用*。所以看起来虽然本地处理适用于非 DOM 对象,但它特别是全局处理不起作用。
-m
*速记处理程序停止工作,因为速记模式仅适用于非 DOM 对象。我个人认为应该从 jQuery 中删除非 DOM 对象的这种“速记”行为。很少有人知道它,而且它只记录在全局 jQuery 对象页面上的一个晦涩的句子中......它的行为可能会让不知道它的人发疯,因为它隐含地执行了人们可能不知道的绑定步骤的。
啊,好吧...该$.event.trigger
功能不是公开的,尽管它被底层事件触发机制使用。我想我只是不应该使用它。事实证明,这种行为对于 jQuery 开发人员来说很难正确实现,而且看起来他们完全放弃了它(或者这就是我从这个标记为“已修复”的错误报告中收集到的:DEPRECATE AJAX "GLOBAL" EVENT BEHAVIOR)。
但我仍然对.trigger
被记录为 DOM 或非 DOM 对象的行为方式相同感到有些困惑,因为仅运行以下警报之一:
我想这意味着foo
设置的属性dom
实际上并不是传统意义上的“正确”JS 属性(尽管在控制台上检查对象时它正确显示)?
注意:现在这一切都是为了知识 - 因为我将只接受上面错误链接中“修复”的建议,并将我所有的 AJAX(和其他全局)事件附加到document
,因为它出现了将是 jQuery 1.9 中的强制行为。但我已经服用了蓝色药丸,感觉自己离兔子洞太远了,无法爬出来。
javascript - RequireJS从外部设置模块变量不生效
我在 requireJS 定义模块中设置变量时遇到问题,它完全没有生效。我有以下(缩减)示例来说明问题:
这是定义的模块:
然后我将“TesterModule”设置为另一个的依赖项并运行以下代码行:
输出到控制台的是:
我原以为应该是:
似乎仅通过执行 variable = blah 在模块中设置变量没有任何效果,似乎需要在模块的方法中设置变量。谁能向我解释这是为什么?还是我编码错误?
提前致谢
javascript - JS 模块模式 = 缓存/更好的性能?
我刚刚阅读了这篇文章http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/。
在标题为“#4 添加缓存”的部分中,它说:
通过在 mixin 周围形成一个闭包,我们可以缓存初始定义运行的结果,并且性能影响非常显着。
我不明白这是如何工作的——在这里使用模块模式如何导致代码的更快/缓存版本?
javascript - 在 javascript 中有条件地实例化模块模式的一个实例
我正在尝试公开一个模块。我只想向所有调用者公开它的一个实例,并且我想等到调用模块来实例化它。我试图这样做:
但实际上它只是一个混淆
我的意图是在第一次调用obj.foobar = new foobar()
时实例化obj.foobar.GetId()
,第二次obj.foobar.GetId()
调用使用已经实例化的版本。尽管此处不存在,但存在需要等待实例化的依赖项,new foobar();
因此无法立即执行。
我怎么能做到这一点,我错过了什么?
javascript - 模块模式和单例模式的区别?
我已经看到在某些项目中,Module Pattern
使用而不是Singleton Pattern
反之亦然。
Module Pattern
我想确切地知道,和有什么不同Singleton Pattern
?
javascript - JavaScript 模块模式与构造函数中定义的方法
从单实例和多实例的角度来看,我为什么要按照模块模式编写所有这些额外的代码行,而不是仅使用标准构造函数以及在构造函数主体中定义的方法和属性?
模块模式示例:http: //jsfiddle.net/T3ZJE/1/
构造函数示例:http: //jsfiddle.net/EuvaS/2/
对我来说,最终的结果几乎是一样的。两者都可以具有公共属性和方法,都可以具有可以被公共方法访问的“私有”变量和方法。
两者都将为单例定义一次公共/原型方法,都将为对象的多个实例/克隆定义多次。
我错过了什么吗?有什么不同?
javascript - 这三种模块模式在 JavaScript 中的实现有什么区别?
我已经看到以下三个代码块作为 JavaScript 模块模式的示例。有什么区别,为什么我会选择一种模式而不是另一种模式?
模式 1
模式 2
模式 3
据我所知,JavaScript 社区似乎普遍支持模式 3 是最好的。和前两个有什么区别?在我看来,这三种模式都可以用来封装变量和函数。
注意:这篇文章实际上并没有回答这个问题,我不认为它是重复的。
jquery - 了解 jQuery 教程模块模式示例
考虑到在学习中心的代码组织部分发布的关于模块模式的最后一个代码片段(下面报告),我试图理解示例中模块的某些方面:
- 变量声明 (
$items
,$container
...) 由 分隔,;
而函数声明 (createContainer
,buildUrl
,showItem
, ....) 由 分隔,
。为什么?有支架问题吗? - 为什么前三个变量( 和 )的
$items
名称$container
以$currentItem
开头$
?这是否意味着用于标识 DOM 片段变量的命名约定(因为javascript
允许使用 character$
)还是有其他原因? - 为什么函数
createContainer
声明为 usingvar
而其他函数 (buildUrl
,showItem
,...) 没有var
?
// 为 jQuery 功能使用模块模式 $( document ).ready(function() {
javascript - Javascript revealing module pattern Noob
I'm starting Addy Osmani's amazing book on javascript design patterns but can't seem to get off the ground. Can anyone tell me what's wrong here with my approach (I'm using Raphael, just for fun.):
javascript - JS模板方法模式中`this`的含义
为什么标记的行找不到protectedACMember
?
有模拟私人、受保护和公共成员的好模式吗?静态/非静态也是?