可能看起来像一个微不足道的问题,但我在使用jQuery时遇到了一个问题.当我尝试获得.ready中元素的高度时,我总是给零.
$(function() {
$('#my-elem').height() // Always gives me zero.
});
Run Code Online (Sandbox Code Playgroud)
如果我在高度检查周围使用setTimeout()延迟代码(例如.5s),那么高度会正确地报告给我.我猜这是因为样式还没有机会应用呢?
我发现这个问题的唯一解决方案是使用一个间隔来轮询元素的高度,直到它变为非零但这对我来说似乎有些过分.有没有更好的办法?
在与揭示模块模式的短暂浪漫之后,我开始意识到单元测试模块的挫折.然而,我无法决定是否是我测试模块的方法或是否存在某种形式的解决方法.
请考虑以下代码:
var myWonderfulModule = (function () {
function publicMethodA (condition) {
if(condition === 'b') {
publicMethodB();
}
}
function publicMethodB () {
// ...
}
return {
methodA : publicMethodA,
methodB : publicMethodB
}
}());
Run Code Online (Sandbox Code Playgroud)
如果我想测试(使用Jasmine)通过publicMethodA到publicMethodB的各种路径.我可能会写一个小测试:
it("should make a call to publicMethodB when condition is 'b'", function() {
spyOn(myWonderfulModule , 'publicMethodB');
myWonderfulModule.publicMethodA('b');
expect(myWonderfulModule.publicMethodB).toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,那么闭包中的publicMethodB副本无法更改.即使我之后更改myWonderfulModule.publicMethodB:
myWonderfulModule.publicMethodB = undefined;
Run Code Online (Sandbox Code Playgroud)
调用myWonderfulModule.publicMethodA仍然会运行B的原始版本.
上面的例子当然是简化的,但是我可以想到很多场景可以通过方法对条件路径进行单元测试.
这是暴露模块模式的限制还是仅仅是对单元测试的误用?如果没有,我可以使用哪些解决方法?我正在考虑转向RequireJS或恢复非模块化代码.
任何建议赞赏!
我一直在尝试使用聚合函数按年份对日期字段进行分组:
db.identities.aggregate([
{
$group : {
_id : { year : {$year : "$birth_date"}},
total : {$sum : 1}
}
}
])
Run Code Online (Sandbox Code Playgroud)
我的一些日期然后在1970年之前,作为一个Windows用户我得到一个关于gmtime的令人讨厌的错误:
{
"errmsg" : "exception: gmtime failed - your system doesn't support dates before 1970",
"code" : 16422,
"ok" : 0
}
Run Code Online (Sandbox Code Playgroud)
我知道现在显而易见的答案是让我运行虚拟机或其他东西,但我只是好奇,如果有任何Windows的解决方案(在我的情况下是Windows 7).如果没有多少性能命中将日期存储为嵌套对象,则:
birth_date : {
year : 1980,
month : 12,
day : 9
}
Run Code Online (Sandbox Code Playgroud)
我不太确定索引等会有多忙.
任何建议赞赏!
更多的讨论而不是问题:
我一直在阅读一篇名为"大规模JavaScript应用程序架构的模式"的文章,到目前为止它已经让人大开眼界了.
本文作者提倡使用pub/sub体系结构,使用中介/控制器.没有给出任何真实的例子,但在实际的幻灯片放映(http://addyosmani.com/blog/jqcon-largescalejs-2012/)中,他主张使用'Amplify.js'.
与许多其他发布/子实现一样,Amplify支持消息优先级.我的理解是,在调解员到位的情况下,消除优先级消息的需求会减少,因为调解员可以控制在何时何地发生的事情.这是一个有效的观点吗?
消息优先级让我感到害怕,因为当应用程序增长(并且变化)时,您最终可能会得到一堆模块,这些模块都在其订阅上设置了不同的优先级,并且无法真正控制正在发生的事情.这是一个有效的问题,还是仅仅误解了它们应该如何使用?
到目前为止,我还没有找到关于这个主题的大量文档.我得到的一般感觉是,在为浏览器实现动画时,最好使用RequestAnimationFrame而不是bog标准JavaScript计时器.我的理解是定时器不可靠,并且它们的分辨率可能因不同的浏览器而异.
我一直在关注这个要点:https://gist.github.com/1114293#file_anim_loop_x.js
但是我不清楚如何确保动画在固定的时间内发生.例如,我可能想在2秒内从左到右动画一些东西.这是否可以使用RequestAnimationFrame或者它是否能够达到目的?
我试图了解ExpressJS和Socket.IO.我的路由在一个单独的文件中,我从app.js中包含:
var express = require('express')
, db = require('./db')
, mongoose = require('mongoose')
, models = require('./models/device')
, http = require('http')
, path = require('path')
, app = express()
, server = http.createServer(app)
, io = require('socket.io').listen(server)
, routes = require('./routes/myRoutes');
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试从我的一个路由发出一个事件时,我没有引用socket.io.
exports.update = function(req, res){
return Item.findById(req.params.id, function(err, item) {
// Do some checks and save.
socket.emit('updated');
}
}
Run Code Online (Sandbox Code Playgroud)
我理解为什么这可能不可用.相反,我不明白获取socket.io句柄的最佳方法是从app.js以外的其他文件.我正在看这个问题(见里卡多的回答),但我还不清楚.理想情况下,我想避免这样做:
routes = requires("routes/myRoutes")(io);
我有一个电子表格,其值如下:
1:29.460
我需要将其转换为
89.460
我有大量的这些游戏补偿.我可以在excel中执行,也可以使用javascript.
有关配方的任何建议表示赞赏!
我正在尝试学习如何使用LINQTOExcel来查询CSV文件.按照网站上的教程,我调整了他们的示例来处理我的数据(文件名通过OpenDialog组件传递给它):
var csv = new ExcelQueryFactory(filename);
var test = from c in csv.Worksheet<TestData>()
select c;
foreach(var t in test)
{
Console.WriteLine(t.Contract_Id);
}
Run Code Online (Sandbox Code Playgroud)
我有一个单独的TestData类/模型,如下所示:
class TestData
{
public string Transaction_Id { get; set; }
public string Value_Date { get; set; }
public string Transmit_Date { get; set; }
public string Transmit_Time { get; set; }
public string Contract_Id { get; set; }
public string Contract_Amount { get; set; }
public string Contract_Rage { get; set; }
public string TestAmount { get; …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何最好地使用jQuery删除匿名事件处理程序.
我定义了一个变量来保存我的jQuery对象:
var dom = $('#private-module');
Run Code Online (Sandbox Code Playgroud)
后来在我的对象中:
run: function () {
var button, that = this;
button = dom.append('<button class="btn">Click Me</button>');
button.on('click', function(event) {
console.log('Clicked!');
that.destroy();
});
},
destroy: function () {
var button;
button = dom.find('.btn');
button.off('click');
}
Run Code Online (Sandbox Code Playgroud)
无论我做什么,我都无法杀死按钮上的点击处理程序.感觉就像我对范围的理解有缺陷.在这种情况下删除处理程序的首选方法是什么?我已经尝试了命名空间事件和所有种类,但没有运气,所以我猜它是一些我忽略的简单.也许我甚至不应该为事件处理程序使用匿名函数.
只是为了解决使用.append的原因:
http://jsperf.com/jquery-append-vs-appendto
这是最终的解决方案:
dom.append('<button class="btn">Send Message</button>');
button = dom.find('.btn');
button.on('click', function (event) {
sendTestMessage();
that.destroy();
});
Run Code Online (Sandbox Code Playgroud)
我也同意并理解使用.one方法.感谢那.
也许我在某个地方的文档中错过了这个但是这里.我有一个负责管理模块的核心控制器.到目前为止,我有大约20个模块,并且希望能够轻松地将它们配置为由核心加载.这意味着我需要大量的数组或大量的调用.在文字对象中创建模块列表然后让模块从中加载它的依赖项是否可接受/良好实践?这是我的意思的一个例子:
Config.js
modules = [
'moduleA',
'moduleB',
'moduleC'
];
Run Code Online (Sandbox Code Playgroud)
Core.JS
define(
['config'],
function(config) {
// Somewhere in here I parse the list and require() each one ?
return {
startAll : function() {
console.log('starting all modules.');
// Then call a method common to all 'modules' in the list above.
}
}
};
}
);
Run Code Online (Sandbox Code Playgroud)
我不确定这是一个好主意,因为我是RequireJS的新手,但我喜欢能够配置从一个地方加载哪些模块的想法.在我的模块中,我指的是我更具体地编写的UI小部件.
我确定这个问题已被问了一百万次,但我还没有找到解决以下问题的方法.
我有一个使用nodejs和express运行的基本应用程序.当我在节点中运行应用程序时,它默认将我发送到我公共文件夹中的index.html.即使我没有设置任何路线.我希望这发生.
我安装了iisnode并在'Default Website'下创建了一个名为'Devices'的新应用程序.我把我的申请保持不变.阅读我需要用web.config排序一些东西,并决定使用这里提到的配置(而不是yaml):
http://tomasz.janczuk.org/2012/05/yaml-configuration-support-in-iisnode.html
当我尝试在浏览器中加载应用程序时,它总是尝试在我的app.js中找到路径并向我发送消息,例如:
无法获取/设备/
我真的用这个把头发拉出来,不知道该怎么办!我是否必须在app.js入口点内为静态内容设置默认路由?我有以下内容:
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
});
Run Code Online (Sandbox Code Playgroud)
但是当我从它的根加载应用程序时,它仍然没有把我交给index.html:
的 'http://本地主机/设备/'
有人能帮我解决这个问题吗?