Come usare JQuery in un controller a vele.("$ Non è definito")
-
21-12-2019 - |
Domanda
Provo a implementare le interrogazioni multiple Sincronizzate in una funzione di controller. Jquery.js è posizionato prima ** / * nel Gruntfile.Io uso le vele v0.9.4. Primo errore:
"$ is not defined"
.
si verifica qui:
var dfd = $.Deferred();
.
Sono nuovo a JS e relativamente nuovo per navigare e la mia bella ricerca per quella domanda era assolutamente senza successo.
Grazie in anticipo, Martin
PS: GruntFile Extrapt:
var jsFilesToInject = [
'linker/js/socket.io.js',
'linker/js/sails.io.js',
'linker/js/app.js',
'linker/js/jquery.js',
'linker/js/jquery.validate.min.js',
'linker/**/*.js'
];
.
Controller Extrapt:
var dfds = [];
var seriesLists = [];
function checkForWord(word,place) {
var dfd = $.Deferred();
Series.find({seriesname:{'contains':'word'}}, function (err,sers) {
seriesLists[place] = sers;
dfd.resolve();
});
return dfd.promise();
}
for(var k=0;k<words.length;k++) {
dfds.push(checkForWord(words[k],k));
}
$.when.apply($, dfds).then(function() {
console.log("seriesLists:",seriesLists);
});
}
. Soluzione
Dovresti tenere conto che:
- .
- Il controller vive sul lato Sailsjs, il che significa: è sul lato server (Nodejs).
- Il file Grunt sta iniettando la libreria jQuery all'HTML che verrà interpretata nel lato client (browser).
Ecco perché il controller non è in grado di vedere la libreria jQuery.Se vuoi avere jquery nel lato server (che trovo in qualche modo dispari) dovresti includerlo con NPM:
npm install jquery
.
o più appropriato:
npm install node-query
.
Comunque, se ciò che stai cercando è il supporto delle promesse, allora puoi semplicemente usare q (che è una delle librerie di Promises più utilizzate là fuori, sia per il lato client o il lato server).Sul lato server, è possibile installare Q come questo:
npm install q
.
(A meno che, naturalmente, non torni completamente sbagliato e stai facendo un controller "lato client" :).
Altri suggerimenti
Controllare l'ordine in cui si include jQuery sulla sezione della testa.
Assicurati che venga incluso una volta sulla tua pagina e prima di questa riga
var dfd = $.Deferred();
. On Sails versione 0.11 JQuery Load After Bootstrap, per Put JQuery prima e non appaiono un errore, la mia app deve aver caricato jQuery prima per Bootstrap funziona correttamente
È necessario andare su questo percorso sulle tue vele 'compiti / pipeline.js' e metti queste 'js / dipendenze / jquery-versione del tuo jquery-.js' dentro di var jsfilestoinject= [-here-] tra 'js/ /sependenze/sails.io.js 'e' js / dipendenze / ** / *. js 'come segue:
// Client-side javascript files to inject in order
// (uses Grunt-style wildcard/glob/splat expressions)
var jsFilesToInject = [
// Load sails.io before everything else
'js/dependencies/sails.io.js',
//For make your jquery load first
'js/dependencies/jquery-2.1.1.js',
// Dependencies like jQuery, or Angular are brought in here
'js/dependencies/**/*.js',
// All of the rest of your client-side js files
// will be injected here in no particular order.
'js/**/*.js'
];
.
Ad esempio, questa è una cattiva configurazione:
var jsFilesToInject = [
'linker/js/socket.io.js',
'linker/js/sails.io.js',
'linker/js/app.js',
'linker/js/jquery.js',
'linker/js/jquery.validate.min.js',
'linker/**/*.js'
];
.
Poiché JQuery caricherà dopo l'app.JS, se nella tua app userai una funzione jQuery verrà visualizzata un errore