2015-03-19 3 views
0

Original Questionfonction objet Javascript appelant une autre fonction dans l'objet, Rails

ne peux pas comprendre pourquoi je ne peux pas appeler la deuxième fonction dans cette première fonction. J'utilise jQuery-turbolinks. (En outre, si vous connaissez un meilleur moyen d'exécuter javascript spécifique à la page dans les rails, laissez-moi savoir.) Actuellement, c'est ma meilleure implémentation où je vérifie si le corps a une certaine classe, et si c'est le cas, je cours la fonction init dans cet objet javascript).

app/assets/JavaScripts/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(); 
    } 
}); 

Solution Après commentaires

tout simplement utilisé object.method() syntaxe à partir d'une méthode pour appeler une autre méthode dans ce même objet :

$(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(); 

}); 

Je n'aime pas à quel point ce code est désordonné, mais l'encapsulation bénéficie d'un design orienté objet, je pense, est solide: le javascript de chaque ressource n'a accès qu'aux méthodes de son objet javascript.

Répondre

1

Je ne sais pas ce que vous essayez d'accomplir avec cette partie de votre déclaration:

var blogsjs = { 
    myBlog: this 
} 

mais, this ne seront pas réglées à blogsjs. Ce sera tout ce qu'il était dans la fonction ci-dessus. En Javascript, this n'est défini que sur un appel de fonction. Il n'est PAS défini dans une déclaration littérale Javascript, donc vous ne pouvez pas déclarer de façon statique une propriété qui fait référence à l'objet lui-même. Javascript ne supporte pas cela.

Vous pouvez ajouter des propriétés après la construction de l'objet contenant des références à l'objet, le cas échéant.

Si vous voulez myBlog être initialisés pour pointer vers blogsjs, alors vous devrez le faire après que l'objet est défini:

var blogsjs = { 
    init: function() {...}, 
    another: function() {...} 
}; 
blogsjs.myBlog = blogsjs; 

En outre, cette ligne de code ne fonctionnera pas :

myBlog.another(); 

parce myBlog est une propriété d'un objet, pas une variable. Il doit être référencé avec son objet parent.

1

Donc, vous obtenez probablement une exception Cannot read property 'another' of undefined car vous spécifiez myBlog sur l'objet blogsjs mais vous ne le référencez pas. Aussi myBlogpas être une référence à blogsjs mais la portée jquery appelle la fonction document.ready avec.

Vous devez soit créer la référence dans votre méthode init:

init: function(){ 
    var myBlog = this; 
    alert("hello from blogs"); 
    $("input").on('click', function(){ 
    $(this).hide('slow', function(){ 
     myBlog.another(); 
    }); 
    }); 
} 

ou simplement utiliser blogsjs d'une portée au-dessus de votre méthode init.

Have a look at this question to learn about scoping.