此流星代码具有menuItems来填充模板中的li。单击某个项目时,我需要获取" login"的值。来自被点击的对象的键
我无法使用menuItems.find();
,因为它不是mongo集合
我无法创建json对象JSON.parse(menuItem)
,因为在控制台中未定义menuItem
我想不出谷歌的用途。
由于
Template.mainMenu.helpers({
menuItems: [
{menuItem: "task1", login: false},
{menuItem: "task2", login: true},
{menuItem: "task3", login: true},
{menuItem: "task4", login: true},
{menuItem: "task5", login: true},
{menuItem: "task6", login: true},
{menuItem: "task7", login: false},
{menuItem: "task8", login: false},
{menuItem: "task9", login: false}
]
});
Template.mainMenu.events({
'click .menuItem': function (event) {
var item = $(event.currentTarget).data('value');
var isLogin = what is the value of login for this "item"
}
});
答案 0 :(得分:1)
这是如此基本,你应该在前100行文档中看到答案。不过,让我解释一下。
您正在使用帮助程序将数据放入li
个元素中。此助手返回一个对象数组,因此您可以将其用作模板中的可迭代对象,即使用each
块:
{{#each menuItems}}
<li class="menuItem">{{menuItem}} {{login}}</li>
{{/each}}
类似的东西。
然后,您有一个事件处理程序,它监听每个具有menuItem
类的元素的每个click事件。把它想象成jQuery的事件处理程序,所以,在jQuery中,你会用这样的方式编写它:
$('.menuItem').each(function () {...});
在传递给each
方法的函数中,您可以通过this
关键字访问iterable的元素。因此,例如,您想要访问任何iterable项的login
属性。你可以这样做
$('.menuItem').each(function () {
console.log(this.login);
});
让我们回到流星。在事件处理程序中,您可以使用相同的方法来访问对象的任何属性。 this
将在用户点击时引用该元素。所以答案是
Template.mainMenu.events({
'click .menuItem': function () {
const item = this;
// do whatever you need with this object
}
});
模板事件处理函数有两个参数,一个用于事件,另一个用于模板。您可能需要它们,但在这种特殊情况下,两者都是不必要的,因此没有为分配为click事件的处理程序的函数提供参数。
请记住,模板中的each
块会创建一个新的嵌套上下文,在此上下文中,this
引用任何each
块迭代的项。这就是您可以通过帮助程序引用JSON中每个对象的属性的原因:
{{#each menuItems}}
<li class="menuItem">{{menuItem}} {{login}}</li>
{{/each}}
您可以看到您没有menuItem
或login
帮助者,但无论如何都可以。事实上,这是
{{#each menuItems}}
<li class="menuItem">{{this.menuItem}} {{this.login}}</li>
{{/each}}