Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 过滤器嵌套在Jade中失败_Javascript_Node.js_Pug - Fatal编程技术网

Javascript 过滤器嵌套在Jade中失败

Javascript 过滤器嵌套在Jade中失败,javascript,node.js,pug,Javascript,Node.js,Pug,我有一些过滤器: var jade = require('jade'); jade.filters.Posts = function(block) { return '{block:Posts}'+jade.render(block)+'{/block:Posts}'; }; jade.filters.Audio = function(block) { return '{block:Audio}'+jade.render(block)+'{/block:Audio}'; }; j

我有一些过滤器:

var jade = require('jade');
jade.filters.Posts = function(block) {
    return '{block:Posts}'+jade.render(block)+'{/block:Posts}';
};
jade.filters.Audio = function(block) {
    return '{block:Audio}'+jade.render(block)+'{/block:Audio}';
};
jade.filters.Video = function(block) {
    return '{block:Video}'+jade.render(block)+'{/block:Video}';
};
并有一些意见

:Posts
    Posts
        :Audio
            | Audio
        :Video
            | Video
所以我有一个错误:

 >> unknown filter ":Audio"
我能处理或解决这个问题吗

PS您可以查看其中的代码-我正在使用grunt和grunt contrib jade插件,但要强制grunt contrib jade使用过滤器,您应该编辑。/node\u modules/grunt contrib jade/tasks/jade.js以反映这一点

PS2:我找到了绊脚石。当我在过滤器中使用
render()
方法时,我从本地jade实例调用它,它不知道关于过滤器的任何信息,但是全局jade实例(来自Gruntfile.js)拥有关于过滤器的所有信息。这就是为什么主要问题是:如何使用过滤器将全局Jade实例提交到文件?

PS3:我不知道如何为这种情况制作小提琴。但是您可以克隆我的,实现,然后在开始运行时运行npmi。要编译模板,请运行
grunt jade
。注意身体内、翡翠内和过滤器内

PS4。我在不同的范围内找到了原因。我详细地描述了它。你能解决这个问题吗?



我愿意接受更多的答案,并且我将接受jade core中的修复(如果需要)。

我认为您正处于问题的位置,问题在
filter.js
文件中

位置
jade/lib/filters.js

var transformers = require('transformers');

module.exports = filter;
function filter(name, str, options) {
  if (typeof filter[name] === 'function') {
    var res = filter[name](str, options);
  } else if (transformers[name]) {
    var res = transformers[name].renderSync(str, options);
    if (transformers[name].outputFormat === 'js') {
      res = '<script type="text/javascript">\n' + res + '</script>';
    } else if (transformers[name].outputFormat === 'css') {
      res = '<style type="text/css">' + res + '</style>';
    } else if (transformers[name].outputFormat === 'xml') {
      res = res.replace(/'/g, '&#39;');
    }
  } else {
    throw new Error('unknown filter ":' + name + '"');
  }
  return res; // returns RES that is not defined in scope of function.
}
filter.exists = function (name, str, options) {
  return typeof filter[name] === 'function' || transformers[name];
};
var变压器=需要(“变压器”);
module.exports=过滤器;
函数筛选器(名称、str、选项){
if(过滤器的类型[名称]='功能'){
var res=过滤器[名称](str,选项);
}else if(变压器[名称]){
var res=transformers[name].renderSync(str,options);
if(transformers[name].outputFormat==='js'){
res='\n'+res+'';
}else if(transformers[name].outputFormat==='css'){
res=''+res+'';
}else if(transformers[name].outputFormat=='xml'){
res=res.replace(/'/g',';');
}
}否则{
抛出新错误(“未知筛选器”:“+name+”);
}
return res;//返回未在函数范围内定义的res。
}
filter.exists=函数(名称、str、选项){
返回过滤器的类型[名称]=“函数”| |变压器[名称];
};
在这里,我发现了一个缺陷,你可以这样纠正

var transformers = require('transformers');

module.exports = filter;
function filter(name, str, options) {
  var res;//defined a variable which is global to the scope of function.
  if (typeof filter[name] === 'function') {
    res = filter[name](str, options);
  } else if (transformers[name]) {
    res = transformers[name].renderSync(str, options);
    if (transformers[name].outputFormat === 'js') {
      res = '<script type="text/javascript">\n' + res + '</script>';
    } else if (transformers[name].outputFormat === 'css') {
      res = '<style type="text/css">' + res + '</style>';
    } else if (transformers[name].outputFormat === 'xml') {
      res = res.replace(/'/g, '&#39;');
    }
  } else {
    throw new Error('unknown filter ":' + name + '"');
  }
  return res;
}
filter.exists = function (name, str, options) {
  return typeof filter[name] === 'function' || transformers[name];
};
var变压器=需要(“变压器”);
module.exports=过滤器;
函数筛选器(名称、str、选项){
var res;//定义了函数范围的全局变量。
if(过滤器的类型[名称]='功能'){
res=过滤器[名称](str,选项);
}else if(变压器[名称]){
res=transformers[name].renderSync(str,options);
if(transformers[name].outputFormat==='js'){
res='\n'+res+'';
}else if(transformers[name].outputFormat==='css'){
res=''+res+'';
}else if(transformers[name].outputFormat=='xml'){
res=res.replace(/'/g',';');
}
}否则{
抛出新错误(“未知筛选器”:“+name+”);
}
返回res;
}
filter.exists=函数(名称、str、选项){
返回过滤器的类型[名称]=“函数”| |变压器[名称];
};
某些函数下的嵌套可能会使音频功能超出范围。音频功能单独工作吗


虽然如果问题没有解决,可能还有其他问题,但请为您的客户制作一把小提琴,以便更好地理解

我们只需将全局jade实例绑定到如下过滤器:

var jade = require('jade');
if (options.filters) {
  // have custom filters
  Object.keys(options.filters).forEach(function(filter) {
    if (_.isFunction(data)) {
      // have custom options
      jade.filters[filter] = options.filters[filter].bind({jade: jade, locals: data()});
    } else {
      // have no custom options
      jade.filters[filter] = options.filters[filter].bind({jade: jade });
    }

  });
}

请参见此处的实现-在此

中,您可以尝试打开github问题以获得支持。过滤器仍然被标记为不稳定,因此您可能会影响设计决策(如果它是一个bug)或让它们更新文档(如果已经有可能)。您如何测试这一点?我也这么做了,这对我很有效。你能发布剩下的代码吗?@bergie我已经有问题了,但是我没有回应them@user568109我用PS更新了这个问题-section@user568109请查看我的代码,也可以显示您的代码吗?在这种情况下,您的更改没有帮助。>音频功能单独工作吗!–对如果所有过滤器都不返回jade.render(block)我在问题的PS3部分添加了如何测试我的代码的指南。你能把第25行从:Audio改为Audio并测试它吗。!你在那里开发的优秀图书馆:)太棒了:)我从来没有想过:)谢谢你的回答。解决方案太棒了。太糟糕了,我不知道多少咕噜声,不能帮助咕噜声任务。我不可能想到这个。