如何在Sails控制器中使用jQuery。 (“$未定义”)

时间:2014-06-04 16:03:32

标签: jquery controller sails.js

我尝试在控制器函数中实现同步的多个查找查询。 Jquery.js放在gruntfile中的** / *之前。我使用Sails v0.9.4。 第一个错误:

"$ is not defined"

发生在这里:

var dfd = $.Deferred();

我是JS的新手,对Sails来说相对较新,我对这个问题的长期研究绝对没有成功。

提前致谢, 马丁

PS: gruntfile摘录:

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'
];

控制器摘录:

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);
});

}

3 个答案:

答案 0 :(得分:2)

你应该考虑到:

  1. 控制器位于sailsjs端,这意味着:位于服务器(nodejs)端。
  2. grunt文件将jquery库注入到将在客户端(浏览器)端解释的html。
  3. 这就是控制器无法看到jquery库的原因。如果你想在服务器端有jquery(我觉得有点奇怪)你应该用npm包含它:

    npm install jquery
    

    或更合适:

    npm install node-query
    

    无论如何,如果你正在寻找的是promises支持,那么你可以使用q(这是最常用的promises库之一,无论是客户端还是服务器端)。在服务器端,您可以像这样安装q:

    npm install q
    

    (除非我完全错了,你正在做一个“客户端”控制器:)。

答案 1 :(得分:0)

检查头部上包含jquery的顺序。

确保在您的网页上和此行之前包含一次

var dfd = $.Deferred();

答案 2 :(得分:0)

在sails版本0.11 jquery加载后引导,为了把jquery放在第一个并且没有出现错误,我的应用程序必须加载jquery才能正确运行引导程序

你必须在你的sails'task / pipeline.js'上找到这条路径,并在jsfilesToInject = [-here-]之间将'js / dependencies / jquery-version of jquery-.js'放在'js之间/dependencies/sails.io.js'和'js / dependencies / ** / * .js'如下:

// 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'
];

例如,这是一个错误的配置:

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'
];

因为jquery会比app.js后加载,如果在你的应用程序中,你将使用jquery函数会出现错误