Javascript对象函数调用对象中的另一个函数,Rails

时间:2015-03-19 01:21:26

标签: javascript jquery ruby-on-rails

原始问题

无法弄清楚为什么我无法在第一个函数中调用第二个函数。我正在使用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对象中的方法。

2 个答案:

答案 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

Have a look at this question to learn about scoping.

答案 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是对象的属性,而不是变量。必须使用其父对象引用它。