Използването на опции за локали вътре във филтъра за нефрит е неуспешно

Опитвам се да използвам опцията локали вътре във филтъра, но се сблъсквам с проблем, този локален обект не е достъпен от филтъра.

Локали: json {"title": "HAMPI"}

филтър:

var jade = require(jade);
jade.filters.Posts = function(block) {
    return '{block:Posts}'+jade.render(block)+'{/block:Posts}';
};

Вход:

body
    |#{title}
    :Posts
        div
            a
                #{title}

Изход:

<body>
    HAMPI
    {block:Posts}<div><a><undefined></undefined></a></div>{/block:Posts}
</body>

Мога ли да поправя или да се справя с тази грешка?

PS Можете да разгледате кода в това хранилище — аз използвам grunt и grunt-contrib-jade плъгин, но за да принудите grunt-contrib-jade да работи с филтри, трябва да редактирате ./node_modules/grunt-contrib-jade/tasks/jade.js, за да отразите промени от това заявка за изтегляне.


person Vladimir Starkov    schedule 15.09.2013    source източник


Отговори (1)


Филтрите се прилагат по време на компилиране, където изобразяването, което има достъп до локални променливи, се извършва по време на изпълнение. Така че вашите локални променливи не са достъпни за филтри. Те виждат само необработен текст. Така че можете да направите това:

jade.filters.Posts = function(block) {
    return '{block:Posts}'+block+'{/block:Posts}'; //remove render
};

По този начин ще отложите изобразяването на #{title}, докато имате променливите. Той произвежда този изход.

<body>HAMPI{block:Posts}HAMPI{/block:Posts}</body>

Как го тествах:

var jade = require(jade);
fn = function(block) {
    return '{block:Posts}'+jade.render(block)+'{/block:Posts}';
};
var fn = jade.compile(fs.readFileSync(__dirname + '/file2.jade'));
console.log(fn({"title": "HAMPI"}));

Същият проблем е споменат тук: в node.js, как да подадете променливи към :stylus filter от jade?

За справка можете да видите тези връзки:

[Актуализация]

Ако искате да използвате рендиране, тогава защо не подадете локалните променливи с него. Така че, ако го направите:

jade.filters.Posts = function(block) {
    return '{block:Posts}'+jade.render(block,{"title": "HAMPI"})+'{/block:Posts}'
};

Дава това:

<body>HAMPI{block:Posts}<div><a><HAMPI></HAMPI></a></div>{/block:Posts}</body>

Недостатъкът, че вашият изглед е местен, не може да се използва и ще трябва да го предадете директно.

person user568109    schedule 18.09.2013
comment
Не мога да премахна конструкцията си jade.render(), защото имам нужда от някаква html конструкция в нея. Актуализирах въпроса. - person Vladimir Starkov; 18.09.2013
comment
Благодаря ви, отговорът ви беше полезен - person Vladimir Starkov; 19.09.2013
comment
можете ли да ми помогнете с подобен въпрос тук? stackoverflow.com/questions/18816979/ - person Vladimir Starkov; 19.09.2013