requirejs + jqueryui = $.widget non défini
Je suis à l'aide de requirejs + jquery + jqueryui. J'ai lu des TONNES d'exemples de comment faire cela. Je crois que je comprends, les différentes approches et il me semble que mon installation devrait fonctionner correctement. Cependant, je reçois parfois un $.widget n'est pas défini erreur dans mes modules personnalisés qui dépendent de jquery ui. C'est une douleur, car il est incohérent et difficile à reproduire, et il est donc difficile pour moi de tester d'autres approches.
Je ne suis pas de calage tous mes plugins jquery, parce qu'il y a beaucoup de choses. Au lieu de cela, je suis le chargement de jquery avec un requirejs appel. Ensuite, dans la fonction de rappel pour que je charge le reste de mes affaires. De cette façon, je n'ai pas de maintenir une liste de cales pour tous mes plugins jquery.
Pour jquery-ui, j'utilise une cale de le faire dépendre de jquery. Tous mes modules personnalisés qui utilisent le widget de l'usine 'jquery-ui" dans leur liste de dépendances.
Dans mes modèles...
requirejs.config({
baseUrl: ATHLETE.siteConfig.jsBaseUrl,
paths: {
'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min',
'jquery-ui': '//ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min'
},
shim: {
"jquery-ui": ['jquery']
},
waitSeconds: 15
});
requirejs(['jquery'], function($) {
requirejs(['site'], function() {
requirejs(['mypage']);
});
});
Remarque que je suis de chargement site.js avant mypage.js. Ils ont partagé quelques dépendances. Dans mon construire de config, j'ai exclure site.js à partir de mypage.js donc partagé les dépendances sont compilés dans site.js et pas mypage.js. Donc, j'ai besoin de charger complètement site.js avant de charger mypage.js ou d'autre peut exiger que vous essayez de charger ceux qui sont partagés dépendances séparément.
Voici un exemple de module personnalisé de la mine qui dépend de jquery-ui.
define([
'jquery',
'jquery-ui'
],function($) {
$.widget('ui.viewAllSponsorsWidget', $.ui.dialog, {
options: {
autoOpen: false,
dialogClass: 'view-all-sponsor-dialog-wrap',
draggable: false,
modal: true,
resizable: false,
width: 370,
height: 400
}
});
});
L'erreur $.widget n'est pas définie est causée par la ligne 5 de ce type de modules personnalisés de la mine. Encore une fois, il est vraiment contradictoires et difficiles à reproduire. Le plus souvent, je n'ai PAS l'erreur, même quand j'ai vider mon cache. Peut-on penser de manière que la ligne 5 pourrait être exécuté avant de jquery-ui est complètement chargé?
Mise à JOUR le 16 Août, 2013
J'ai été en mesure de suivre cela d'un peu plus.
J'ai créé un module simple qui dépend de jquery et jquery-ui.
define([
'jquery',
'jquery-ui'
],function($) {
console.log('$.widget is defined? ' + Boolean($.widget));
console.log('jQuery.widget is defined? ' + Boolean(jQuery.widget));
});
La sortie se présente comme suit:
LOG: $.widget is defined? false
LOG: jQuery.widget is defined? true
Donc, en quelque sorte, le mondial de l'objet jQuery a widget défini, mais la copie qui m'a été fourni par requirejs ne pas.
OriginalL'auteur Dustin | 2013-07-22
Vous devez vous connecter pour publier un commentaire.
Ces réponses sont un peu vieux. J'espère que d'offrir un peu d'une mise à jour de réponse. jQuery UI est désormais livré avec le support AMD intégré. Vous pouvez tout simplement obtenir de l'aide
puis dans requirejs.config simplement ajouter jquery_ui pour les chemins d'accès{} de la section. Pas de cale est plus requis.
Si vous voulez charger uniquement le petit paragraphe de jquery-ui que vous avez besoin, puis de verdure installer jquery-ui, puis utiliser l'outil de génération qui requirejs pour créer un package. Sinon, si vous essayez d'importer un fichier individuel puis chacun de jquery-ui fichiers que vous essayez de charger leurs dépendances, et vous obtiendrez des choses comme "widget non définie" ou "impossible de trouver le fichier widget.js" etc.
J'ai fait une rapide description ici: https://hendrixski.wordpress.com/2015/04/17/adding-only-the-parts-of-jquery-ui-that-you-need-into-your-requirejs-project/
Espère que ça aide.
OriginalL'auteur hendrixski
Changer votre cale à ceci:
Voici un exemple d'un tas de Require.js les configurations pour les bibliothèques populaires.
Je pense que la vraie solution est de cale de tous vos plugins jQuery qui dépendent de jQueryUI.
Si vous regardez ma dernière mise à jour j'ai été en mesure de reproduire le problème sans utiliser de plugins jquery. Uniquement à l'aide de jquery, jquery ui et d'un module personnalisé qui en dépend.
OriginalL'auteur Greg Franko
eu un problème similaire ont été 3ème partie ASP.NET les contrôles ont été détournement de l'jQuery définir.
$telerik.$ = jQuery.noConflict();
Bien que le script nettoie lui-même, la queue du script jQuery efficacement écrasait mon RequireJS cartographie
if ( typeof définir === "function" && définir.amd ) {
define( "jquery", [], function () { return jQuery; } );
}
RequireJS serait de retarder le chargement de scripts et l'RadScriptManager permettrait de garder l'injection de scripts sous la balise de formulaire donc il y avait beaucoup de bizarre course de questions.
Pour certaines demandes, $ a partir de ma carte global
D'autres demandes de $ a $Telerik.$ et n'a pas été globale et une version différente
Pour résoudre mon problème j'ai roulé en arrière à la version jQuery le Telerik contrôles ont été en utilisant et codés en dur dans un sac de balises pour s'assurer qu'il était toujours disponible et puis désactivé Telerik de charger ses propres JQuery. Pas d'AMD, mais fonctionne assez bien pour moi.
OriginalL'auteur Steve
Je pense avoir une solution à mon problème. Mais depuis que ce problème a été difficile à reproduire, je vais attendre un peu avant que je "accepter" ma propre réponse comme correcte. Aussi, ma réponse n'a pas de charge à l'aide de jquery requirejs. Je ne vois pas pourquoi c'est important pour moi. Mais si quelqu'un voit un moyen d'accomplir cela sans avoir à les charger jquery dans une autre balise de script, faites le moi savoir.
Depuis jQuery définit lui-même comme un nommé AMD module, il me suffit de le charger de façon synchrone d'abord l'aide d'une balise de script avant je fais tout requirejs choses. Puis, j'ai aussi supprimer mes chemins d'entrée pour jquery, puisqu'elle est déjà chargé, sous le nom de 'jquery' par ce point. En faisant cela, requirejs retourne la bonne "copie" de jQuery pour moi et tout fonctionne. J'ai aussi besoin d'utiliser jQuery.noConflict parce que j'utilise Garmin Communicator, qui dépend du Prototype. Donc, voici mon code mis à jour, en omettant la pertinence des pièces.
Et mes modules dépendent encore de jquery et jquery-ui, comme d'habitude:
OriginalL'auteur Dustin
si vous souhaitez remplacer une méthode de jQuery-ui , alors le mieux est d'utiliser Requirejs méthode init , cela permet de s'assurer que, dans chaque module, qui inclure jQuery-ui utiliser le même code modifié.
utiliser votre Cale comme ce
OriginalL'auteur Pushker Yadav
J'ai rencontré un semblable, très occasionnelle d'erreur lors de l'utilisation de jQuery UI avec Require.js que je fixe à l'aide de la jqueryui-amd script de conversion de créer des "AMD gainé de modules pour jQuery UI pour une utilisation dans les chargeurs comme RequireJS".
Installer à l'aide de mnp.
Convertir les fichiers JavaScript jQuery UI téléchargé à partir de jqueryui.com
Puis ajouter le chemin du nouveau converti
jqueryui
répertoire de votre require.js fichier de configuration.Enfin, dans votre fichier JavaScript lorsque vous utilisez l'un des composants de l'INTERFACE utilisateur jQuery.
OriginalL'auteur Ben Smith
J'ai eu le même problème que vous, la définition de mes widgets au sein de RequireJS modules, et même si je ne suis pas 100% sûr que c'est la meilleure solution, il a été celui qui a fonctionné pour moi, sans violer l'intégrité des modules:
Lorsque vous avez besoin de jquery ui dans votre module jQuery sera auto-requis et de l' $ objet aurez tout ce dont vous avez besoin.
OriginalL'auteur Oerlien