如果我在javascript中设置了超时
var myTimeoutId = setTimeout( function(){
... do some stuff ....
}, 15000);
Run Code Online (Sandbox Code Playgroud)
并且一个不同的事件让我需要立即执行超时,有没有办法可以使用存储的id来执行函数?我知道我可以保存关闭该功能的引用,调用clearTimeout上myTimeoutId,然后直接调用函数,但有参与该记帐,像样的数目.
是否有一个功能 executeNow( myTimeoutId )?
我有一条我已经剥离的余烬路线
App.MyRoute = Ember.Route.extend({
model: function(params){
console.log("model function executing");
Ember.Object.create()
},
setupController: function(controller){
console.log("setupController function executed");
}
});
Run Code Online (Sandbox Code Playgroud)
当我切换到MyRoute时,setupController会被执行,但填充模型的函数永远不会执行.该模型最终只是msg在 {{link myRoute msg}}标记中传递的对象.
在我们切换到该路由时,我需要加载/计算模型的某些部分.要做到这一点,我需要能够成功更新模型,或者我需要访问setupController函数中链接中传递的参数.关于如何最好地实现这一目标的建议?
编辑
为了尝试散列这个,我创建了一个完整的最小示例,它将产生这种行为:
我的HTML是:
<html>
<head>
<title> This is my Page! </title>
<script src="js/libs/jquery-1.8.2.js"></script>
<script src="js/libs/handlebars-1.0.rc.1.js"></script>
<script src="js/libs/ember.js"></script>
<script src="js/app.js"></script>
</head>
<body>
<script type="text/x-handlebars">
{{#linkTo example App.thing}}<p> go </p>{{/linkTo}}
<div>
{{outlet}}
</div>
</script>
<script type="text/x-handlebars" data-template-name="index">
<p> Initial Text </p>
</script>
<script type="text/x-handlebars" data-template-name="example">
<p> After change </p>
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
使用应用代码:
var App = …Run Code Online (Sandbox Code Playgroud) 我希望能够将焦点设置为textarea,因为鼠标单击不在该任务区域中.
作为一个最小的例子,假设我从一个文本开始,如果你点击它,它将被替换为文本字段.我可以通过一个把手脚本实现这个目标:
<script type="text/x-handlebars">
{{#if isActive}}
{{view Ember.TextField}}
{{else}}
<p {{action foo}}> Click Here to Enter text </p>
{{/if}}
</script>
Run Code Online (Sandbox Code Playgroud)
与控制器
App.ApplicationController = Ember.Controller.extend({
isActive: false,
foo: function(){
this.set("isActive", true);
}
});
Run Code Online (Sandbox Code Playgroud)
这适用于在单击时创建文本字段,但不会将焦点放在该文本区域上(只需单击二次即可实际输入文本).
有没有一个很好的方法来实现这一目标?我可以通过在模板中设置ID并使用jquery选择它来做一些hacky,但这似乎不够优雅.
如果我在模板中使用计算属性,如何让模板知道状态已经以影响该计算值的方式发生了变化?
例如,如果我显示两个可以递增的数字及其总和,如下所示
App.ApplicationController = Ember.Controller.extend({
x:0,
y:0,
sum: function(){return this.get("x") + this.get("y");}.property("content.sum"),
incX: function(){ this.set("x", this.x+1);},
incY: function(){ this.set("y", this.y+1);},
});
Run Code Online (Sandbox Code Playgroud)
<script type="text/x-handlebars">
<button {{action "incX"}}> {{x}} </button>
<button {{action "incY"}}> {{y}} </button>
<p> {{sum}} </p>
</script>
Run Code Online (Sandbox Code Playgroud)
x和y值将在显示中更新,但总和不会更新.如何判断把手/余烬的总和是否依赖于x和y?
我正在使用一个记录很少的javascript API,并且需要编写回调函数,其中参数尚未记录.作为一个开始步骤,我需要检查传入的内容.如果我知道只有一个输入,我可以将回调函数设置为
function( stuff ){
console.log(stuff);
}
Run Code Online (Sandbox Code Playgroud)
并从那里工作.当我不知道有多少输入时,是否有一种优雅的方式来检查输入?我可以做点什么
function(a,b,c,d,e,f){
console.log(a)
console.log(b) // is this undefined?
console.log(c) // how about now?
....
console.log(f) // if this isn't undefined I need to do it again with more args
}
Run Code Online (Sandbox Code Playgroud)
它会很好,但它很难看.是否有更简单的方法可以找出已将多少个参与者传递给函数?
我有javascript代码,如果它在浏览器中运行会引发警报,但是当我运行单元测试时我不想提出警报.
我试着用一条线来解决这个问题
if( allowAlerts === false ){
alert = console.log;
}
Run Code Online (Sandbox Code Playgroud)
但是当我跑的时候
alert("This bad thing happened");
Run Code Online (Sandbox Code Playgroud)
我回来了
TypeError: Illegal invocation
Run Code Online (Sandbox Code Playgroud)
直接重新分配警报是一个kludgey解决方案,我可以通过其他方式轻松解决问题,但我以前从未遇到过非法调用错误,并希望有人能够解释它的含义.
我有一组正则表达式存储在一个对象中,沿着它的风格
myRegexes = {};
myRegexes.reg1 = /[a-z]+[0-9]+/;
myRegexes.reg2 = /[a-e]+/;
Run Code Online (Sandbox Code Playgroud)
我可以这样做 myRegexes.reg1.exec(sampleStr) ,它完美无缺.
但是,如果我循环通过这个对象说
for( reg in myRegexes ){
reg.exec(sampleStr);
}
Run Code Online (Sandbox Code Playgroud)
我得到一个例外,说"TypeError:Object reg1没有方法'exec'"
我知道javascript对于for-for循环的方式很不满意,但我不知道它是如何成功找到变量的,但在此过程中失去了它的方法.任何人都可以告诉我为什么这会失败以及正确的方法是什么?