2012-12-13 10 views
7

Używam fabryki widżetów interfejsu użytkownika jQuery.Właściwy sposób tworzenia zmiennej instancji za pomocą jQuery UI Widget Factory

$.widget("myPlugin" , { 

    options: { 
    }, 

    _create: function() { 
    }, 

    instanceVar: "huzzah!" 

}); 

Podczas testowania wygląda na to, że instanceVar jest częścią prototypu. Tak samo jest we wszystkich przypadkach wtyczki.

mogę rozwiązać ten problem poprzez umieszczenie instanceVar do opcji, tak jak poniżej:

$.widget("myPlugin" , { 

    options: { 
     instanceVar: "huzzah!" 
    }, 

    _create: function() { 
    }, 

}); 

jednak, że wydaje się dziwne, jak instanceVar jest tylko zmienna wewnętrzna do użytku przez wtyczkę - nie czymś użytkownik wtyczki powinien być w stanie się zmienić.

Czy istnieje inny (lepszy) sposób, aby to osiągnąć?

Dzięki za pomoc!

+2

można przechowywać prywatne dane na samej instancji na przykład wewnątrz _create, powinieneś być w stanie zrobić 'this.instanceVar =" huzzah! "' –

Odpowiedz

12

można przechowywać prywatne dane na samej instancji, na przykład wewnątrz _create, powinieneś być w stanie zrobić this.instanceVar = "huzzah!"

$.widget("ui.myPlugin", { 

    options: { 
     foo: "foo" 
    }, 

    _create: function() { 
     this.instanceVar = "huzzah!" 
    }, 

    _setOption: function() { 
     this.instanceVar = "worky!"; 
    }, 

    destroy: function() { 
     console.log(this.instanceVar); 
    } 

}); 

$(document).myPlugin().myPlugin("option","foo","bar").myPlugin("destroy"); // "worky" 

$("body").myPlugin().myPlugin("destroy"); // "huzzah! 

Demo: http://jsfiddle.net/PGUqr/

+1

Możesz także zadeklarować prywatną instancję zmienną, podobnie jak funkcję, używając prefiksu podkreślenia jako konwencji. _instanceVar: undefined, –

+3

Należy zauważyć, że użycie przedrostka podkreślenia w rzeczywistości nie uniemożliwia dostępu do takich "prywatnych" członków i metod. Nadal możesz uzyskać do nich dostęp za pomocą $ ('# myElement'). Data ('nazwa wtyczki') ._ foo. Tym, co dodaje podkreślenie, jest pominięcie tej funkcji za pomocą zwykłego sposobu wywoływania metod na widżecie: $ ("# myElement"). PluginName ("somePublicFunction"). Po uzyskaniu odwołania do instancji widgetu masz pełny dostęp do wszystkiego, niezależnie od tego, czy ma on wiodące podkreślenie. – jinglesthula

+0

Należy również zauważyć, że chociaż element 'option' nie ma znaku podkreślenia, dokumenty wskazują na dostęp do jego zawartości za pomocą metody .option(): https://api.jqueryui.com/jquery.widget/#method-option – jinglesthula