2010-11-15 4 views
1

J'ai une fonction que j'appelle pour récupérer un volet coulissant (telerik contrôle séparateur) Je pensais que je pouvais utiliser cette fonctionfermeture de javascript, ne fonctionne pas?

function getZone() { 
     var slidingZone = $find("<%= slidingZone.ClientID %>"); 
     return function() { return slidingZone; }; 
    } 

de sorte qu'il n'a pas à « trouver » la zone de glissement à chaque fois . Mais ça ne marche pas.

... Cela ne

function getZone() { 
     var slidingZone = $find("<%= slidingZone.ClientID %>"); 
     return slidingZone;  
} 

Pouvez-vous me dire pourquoi le premier ne fonctionne pas?

BTW, je l'utilise comme ça ....

function hideTreePane() { 
     var paneId = "<%= slidingPane.ClientID %>"; 
     getZone().undockPane(paneId); 
     return true; 
    } 

Répondre

2

Eh bien, la première fonction renvoie une fonction et vous voulez que la fonction interne soit exécutée.

Si vous invoquez le résultat de celui-ci, vous verrez fonctionner, par exemple:

getZone()(); 

Je pense que vous voulez que la suivante, utilisez une fonction anonyme exécutée immédiatement, pour appeler la méthode $find une seule fois, le stockage de son résultat:

var getZone = (function() { 
    var slidingZone = $find("<%= slidingZone.ClientID %>"); 
    return function() { return slidingZone; }; 
})(); 
+0

oui, c'est ce à quoi je pensais. –

+0

@Tom, oui, parce que IMO il n'y a pas de raison de faire ce que la réponse acceptée suggère, la fonction retournée n'est pas vraiment utile, vous allez toujours exécuter '$ find' * toujours *, dans les coulisses ... Et cela peut causer confusion, par exemple, comment un développeur saurait que 'getZone' renvoie une autre fonction à exécuter? – CMS

+0

pourquoi exécuterait-il trouver dans les coulisses? Mon impression était la fonction retournée aurait accès au résultat de $ find (la variable slidingZone) en raison de la mise en œuvre de la fermeture de javascript. C'était un peu ce que je voulais. –

4

Vous devrez appeler la fonction que vous revenez de getZone:

getZone()().undockPane(paneId); 

Il ne fonctionnait pas parce que la fonction getZone elle-même n'a pas de membre appelé undockPane.

EDIT:

Je pense qu'il serait préférable de le faire: Parce que votre retour d'une fonction et vous

getZone().undockPane(paneId); 
+1

Correct, mais beurk. – tvanfosson

+0

@tvanfosson: D'accord. –

4

:

function getZone() { 
    if (getZone.cache === undefined) 
     getZone.cach = $find("<%= slidingZone.ClientID %>"); 
    return getZone.cache; 
} 

Ensuite, vous appelleriez comme ça besoin de l'évaluer ... Si vous utilisez la première fonction, cela peut fonctionner ..

function hideTreePane() { 
    var paneId = "<%= slidingPane.ClientID %>"; 
    var zoneFunc = getZone(); 
    zoneFunc().undockPane(paneId); 
    return true; 
} 
+0

Merci, cela a du sens. –

2

Dans votre premier exemple vous retournez une fonction, donc getZone() devient une fonction elle-même et que vous devez faire getZone()() pour obtenir la valeur slidingZone que vous voulez.

Inutile d'envelopper votre valeur de retour dans une fonction pour ce cas.

2

Vous renvoyez une fonction du premier exemple, pas une valeur. Vous devez évaluer la fonction pour que cela fonctionne. Essayez quelque chose comme.

var slidingZone; 
function getZone() { 
    if (!slidingZone) { 
     slidingZone = $find(...); 
    } 
    return slidingZone; 
} 

Il serait mieux pour que cela fasse partie d'une « classe » de telle sorte que la variable de la mise en cache est pas dans la portée globale.