原始问题
无法弄清楚为什么我无法在第一个函数中调用第二个函数。我正在使用jQuery-turbolinks。 (另外,如果你碰巧知道一种更好的方法只能在rails中运行特定于页面的javascript,请告诉我。目前这是我最好的实现,我检查身体是否有某个类,如果它有,那么我运行这个javascript对象中的init函数。)
应用程序/资产/ Javascript角/ blogs.js
$(document).ready(function(){
var blogsjs = {
myBlog: this,
init: function(){
alert("hello from blogs");
$("input").on('click', function(){
$(this).hide('slow', function(){
myBlog.another();
});
});
},
another: function(){
alert("I was called!")
}
};
if($('body').hasClass("blogs") == true){
blogsjs.init();
}
});
反馈后的解决方案
只需在方法中使用object.method()
语法来调用同一对象中的另一个方法:
$(document).ready(function(){
var blogsjs = {
init: function(){
alert("hello from blogs");
$("input").on('click', function(){
$(this).hide('slow', function(){
blogsjs.another();
});
});
},
another: function(){
alert("I was called!");
blogsjs.yetanother();
},
yetanother: function(){
alert("yet another called");
}
};
blogsjs.init();
});
我不喜欢这段代码看起来多么混乱,但我认为,面向对象设计的封装效果非常可靠:每个资源的javascript只能访问其javascript对象中的方法。
答案 0 :(得分:1)
因此,您可能会收到Cannot read property 'another' of undefined
异常,因为您在myBlog
对象上指定了blogsjs
但未引用它。另外myBlog
将不作为对blogsjs的引用,但范围jquery将调用document.ready函数。
您需要在init
方法中创建引用:
init: function(){
var myBlog = this;
alert("hello from blogs");
$("input").on('click', function(){
$(this).hide('slow', function(){
myBlog.another();
});
});
}
或仅使用blogsjs
方法上方的一个范围内的init
。
答案 1 :(得分:1)
我不知道你在宣言的这一部分要做什么:
var blogsjs = {
myBlog: this
}
但是,this
不会设置为blogsjs
。这将是上述功能中的任何内容。在Javascript中,this
仅在函数调用上设置。它不是在Javascript文字声明中设置的,因此您无法静态声明引用该对象本身的属性。 Javascript只是不支持。
如果需要,可以在构造包含对象引用的对象后添加属性。
如果您希望将myBlog
初始化为指向blogsjs
,则必须在定义对象后执行此操作:
var blogsjs = {
init: function() {...},
another: function() {...}
};
blogsjs.myBlog = blogsjs;
此外,这行代码还不起作用:
myBlog.another();
因为myBlog
是对象的属性,而不是变量。必须使用其父对象引用它。