2010-09-24 5 views
3

J'ai du mal à comprendre ce qui se passe ici. J'essaye de coder un certain onClick javascript pour un bouton sur une vue de liste de Force.com pour un objet fait sur commande. Voici le JS.AJAX toolkit - problème avec webservice exécuter

{!REQUIRESCRIPT("/soap/ajax/15.0/apex.js")} 
{!REQUIRESCRIPT("/soap/ajax/15.0/connection.js")} 


var myURL = sforce.apex.execute("MyWebServices", "myUrl", {}); 

et voici le webservice que je tente d'appeler.

global class MyWebServices { 

    webservice static String myUrl(){ 
    return 'www.foo.com'; 
    } 

} 

Lorsque je clique sur le bouton, je reçois le petit pop-up d'alerte en disant:

« Un problème avec le JavaScript OnClick pour ce bouton ou un lien a été rencontré: Impossible d'appeler la méthode « exécuter » de undefined " Lorsque je répète les membres de" sforce ", il n'y a pas de" sommet ". J'utilise littéralement exactement la même syntaxe dans un autre bouton de cette même org, la seule différence étant les méthodes que j'appelle. Ce bouton fonctionne. En fait, si je copie le code du script de problème et le place en tête du script de travail sur l'autre bouton cela fonctionne. Qu'est-ce que j'oublie ici? Voici plus de détails sur l'élément à deux boutons de ce problème: Un bouton (qui fonctionne) est un bouton d'affichage de liste sur le compte, l'autre (cassé) est sur un bouton de liste d'objets personnalisés pour Foo__c.

J'utilise ce code pour les deux:

{!REQUIRESCRIPT("/soap/ajax/10.0/apex.js")} 
{!REQUIRESCRIPT("/soap/ajax/10.0/connection.js")} 
alert(sforce.apex.execute("HammockWebServices", "crossCoverageUrl", {})); 

sur compte, il fonctionne parfaitement, sur Foo__c il ne fonctionne pas. J'ai essayé de changer l'ordre des instructions! REQUIRE ... sans effet observable.

Outre l'étiquette et le nom des boutons, ils semblent définis de façon identique: Liste Bouton Affichage cases à cocher Exécuter JavaScript OnClickJavaScript

Y at-il des autorisations au niveau objet, des profils ou des règles de partage qui affectent qui javascript les paquets peuvent être accédés? (Notez que même si c'était le cas, j'essaye ceci comme sysadmin, et n'obtenant nulle part ...)

+0

À mon humble avis, vous voudriez utiliser Visualforce pour cela.Cela vous épargnera beaucoup de maux de tête au lieu de traiter avec le toolkit ajax qui est la toute première itération des outils construits par salesforce, et qui est beaucoup plus difficile à utiliser. –

Répondre

0

Votre organisation utilise-t-elle des espaces de noms? Si oui, alors la syntaxe d'appeler la fonction change légèrement de:

var myURL = sforce.apex.execute("MyWebServices", "myUrl", {}); 

à:

var myURL = sforce.apex.execute("MyNamespace.MyWebServices", "myUrl", {}); 
+0

aucun espace de noms. De plus, je serais un peu (mais pas profondément .. c'est salesforce) surpris qu'il me dirait que "apex" était undef si le problème était l'espace de noms d'une méthode webservice apex. – Ben

0

Je pense que connection.js doit se charger avant apex.js, essayez de changer l'ordre.

Edit: de apex.js

if (!sforce) { 
    throw "unable to find sforce. Make sure that connection.js is loaded before apex.js script"; 
} 

Mais depuis le changement de l'ordre des scripts ne semble pas avoir d'effet, le problème est peut-être avec les versions de l'API? Je vois que vous utilisez la version 10, qui est assez ancienne, est-ce que votre classe Apex utilise aussi la même version? Essayez de changer les versions pour voir ce qui fonctionne.

+0

L'a mis en mode sans effet. En outre, dans l'autre bouton qui fonctionne, ou si je déplace ce code sur l'autre bouton, il fonctionne dans l'ordre affiché, – Ben

+0

Je reçois une erreur javascript lorsque je l'essaie avec apex.js chargé en premier. Cependant, cela peut dépendre de la page où se trouve le bouton personnalisé - quelle page SF fonctionne et laquelle ne fonctionne pas? –

+0

J'ai mis à jour les détails de la question avec cette info-- – Ben

0

"connexion" doit être référencé avant "apex". Il configure l'objet sforce de base.

+2

Cette réponse a déjà été suggérée. La meilleure chose à faire dans ce cas est, plutôt que de lire cette réponse, une fois que vous avez [assez de réputation (15)] (http://stackoverflow.com/privileges), upvote la réponse (s) que vous pensez résoudre le problème. – Ktash

Questions connexes