1

我已经看到了许多关于如何在循环中访问属于父上下文的变量的示例。但是,我不仅需要访问变量,还需要更改/更新它。

正如您在下面看到的,我有一个设置变量的自定义助手,但是当我尝试在循环内更改该变量时,它不起作用。有没有办法让它工作?

请看一下这个jsFiddle

模板

{{setVarWithName "test" "hello"}}
{{#each questions}}
    <h3>{{title}}</h3>
    <p>before update: {{../test}}</p>
    {{setVarWithName "test" "goodbye"}}
    <p>after update: {{../test}}</p>
    <hr />
{{/each}}

带助手的车把初始化

var source = $("#template").html(); 
var template = Handlebars.compile(source); 

var data = {
  "questions": [
     {"title": "Question 1"},
     {"title": "Question 2"}
   ]
}; 

Handlebars.registerHelper('setVarWithName', function (name, value) {
    this[name] = value;
    return '';
});

$('body').append(template(data));
4

1 回答 1

2

答案,就像在 JavaScript 中经常出现的一样,是作用域。基本上,在循环内部使用时this,助手内部setVarWithName并不指向data变量{{#each}},但它确实指向question[@index]. 你需要做什么:

var source = $("#template").html(); 
var template = Handlebars.compile(source); 

var data = {
  "questions": [
     {"title": "Question 1"},
     {"title": "Question 2"}
   ]
}; 

Handlebars.registerHelper('setVarWithName', function (name, value) {
    data[name] = value; // changed from this to data
    return '';
});

$('body').append(template(data));

看我的工作小提琴。为了便于阅读,我添加{{s}}了打印渲染this到模板中的助手。

于 2018-01-30T05:16:51.530 回答