4

我一直在 Meteor 中开发一个小型应用程序。我注意到一种代码模式开始困扰我。

Template.userForm.helpers({
    name: function(){
        user = Meteor.users.findOne(Session.get('edit-user'));
        return user && user.profile.name;
    },

    _user_id: function(){
        user = Meteor.users.findOne(Session.get('edit-user'));
        return user && user._id;
    },
    email: function(){
        user = Meteor.users.findOne(Session.get('edit-user'));
        return user && user.emails && user.emails[0].address;
    },

});

问题是看到variable && variable.attribute代码重复。如果我不以这种方式编写代码,我会收到有关未定义变量的错误。

有一个更好的方法吗?我错过了什么?

4

2 回答 2

6

return variable && variable.attribute相当于更详细

if(variable) return variable.attrubite;

return false;

这是必要的,因为如果variablenull- 在页面加载和集合膨胀之间一直发生 - 调用variable.attribute会引发异常:null没有属性。

所以不,那张支票是逃不掉的。如果这让您感到困扰,您可以选择另一种口味 - 就个人而言,我将实际返回最后一行并提前检查正确性:

if(! variable) return null;

return variable.attribute;

可以避免的是,这一行 - 在您的所有助手中也重复出现:

user = Meteor.users.findOne(Session.get('edit-user'));

 


 

然而,在上述情况下,所有属性都属于一个对象。那么为什么不传递这个单一的对象呢?

userForm.js:

Template.userForm.user = function() {
    return Meteor.users.findOne(Session.get('edit-user'));
}

用户表单.html:

<template name="userForm">
    <span data-id="{{user._id}}">
        Name: {{user.name}}, email: {{user.email}}
    </span>
</template>

甚至:

<template name="userForm">
    {{#with user}}
        <span data-id="{{_id}}">
            Name: {{name}}, email: {{email}}
        </span>
    {{/with}}
</template>
于 2013-07-10T15:40:23.970 回答
3

您可能想要定义一个全局帮助器,尤其是在使用Session变量时,这将更加灵活并允许跨多个模板使用:

Handlebars.registerHelper("getUserProperty", function(field) {
    var user = Meteor.users.findOne(Session.get('edit-user'));
    return user && user[field];
});

然后,您可以使用它{{getUserProperty "username"}}或类似的东西。您还可以让field参数更花哨,以便您可以使用类似的东西"profile.name"并重复索引到对象中。类似于以下内容,尽管您绝对可以支持更多的解析逻辑:

Handlebars.registerHelper("getUserProperty", function(field) {
    var item = Meteor.users.findOne(Session.get('edit-user'));

    var keys = field.split(".");

    $(keys).each( function(idx, value) {
        item = item && item[value];
    });

    return item;
});

var需要注意的一件事:在声明局部变量时,您可能应该使用more。您不必在 Coffeescript 中执行此操作,但它在 Javascript 中非常重要。

于 2013-07-10T16:14:48.460 回答