我正在使用Javacript(使用jQuery)为我的用户界面创建一个Manager对象。一般的想法是捕获所有可点击的元素(使用.clickable类定义),然后根据元素的id创建相应的对象来处理所需的操作。
这是我的经理对象定义:
function Manager() {
this.init = function() {
$('.clickable').click( function() {
var l = this.id.split("_");
var controller = Manager.ucfirst(l[0]) + "()";
var action = l[1];
var nclass = new controler;
});
};
this.init();
}
当用户点击像
这样的可点击元素时<a id="user_login" class="clickable">Login</a>
然后这个管理器应该创建一个对象User(id的第一部分用大写的第一个字母),然后执行方法login(id的第二部分)。
但事实上,当我点击元素时,我会收到一个&#34;未捕获的TypeError:字符串不是函数&#34;。
嗯,我知道字符串不是函数!但我假设Javascript非常聪明,可以在PHP中使用类似$$变量的东西。
我做过一些研究但没有实际结果。请有人帮帮我吗?
答案 0 :(得分:1)
当您运行此代码Manager.ucfirst(l[0]) + "()"
时,它将返回一个类似&#34; User()&#34;的字符串。显然,这不是与new
关键字一起使用的构造函数。您应该做的是这样的事情(假设User
在全球范围内可用):
var controller = window[Manager.ucfirst(l[0])];
在这里按键获取window
对象属性。所以controller
在这种情况下将是function
,一切都应该有效。
答案 1 :(得分:1)
以下是您可以采取的措施:
function Manager() {
this.init = function() {
$('.clickable').click( function() {
var l = this.id.split("_");
var controller = Manager[l[0][0].toUpperCase() + l[0].substring(1)];
var action = l[1];
var nclass = new controler;
});
};
this.init();
}
关键是你应该为控制器分配一个函数类型,而不是一个看起来像函数调用表达式的字符串。如果被引用的Manager实例定义了一个被命名为Manager[l[0][0].toUpperCase() + l[0].substring(1)]
的评估的属性,那么这应该有效。否则,它将失败。
我必须说你的问题背景对我来说不是很清楚,所以我建议采用以下方法来更好,更全面地解决你的问题:
var Manager = ({
User: function(){ // here's your user constructor
// ...
},
init: function() {
var self = this;
$('.clickable').click( function() {
var l = this.id.split("_");
var controller, nclass,
action = l[1],
controllerName = l[0][0].toUpperCase() + l[0].substring(1);
if(self[controllerName]){ // checking if it exist cos you never know where the shit that happens all come from.
controller = self[controllerName]; // returns the constructor
nclass = new controler; // invokes the constructor
} else{
throw new Error("Don't know what to do with unknown controller: '" + controllerName + "'";
}
});
return this; // i.e self
}
}).init();