访问视图中的模型实例方法(Sails.js / EJS)

时间:2014-02-27 00:23:07

标签: javascript node.js sails.js ejs

我注意到当一个模型实例(对象)传递给一个视图时,它被剥夺了所有函数。有没有办法解决这个问题?

示例:

我的用户模型有方法fullName,智能地合并名字,姓氏和前缀。

在控制器中我有:

User.find().done(function(err,users){
  res.view({
    users:users
  });
});

如果我遍历控制器中的用户,我可以执行user.fullName();

如果我在视图中执行相同操作,则会出现未定义的方法错误。

我可以直接在控制器或视图中访问模型属性(例如user.firstName,user.lastName)

在其他MVC架构上(例如rails / zendPHP)我通常在模型中做这样的事情,并且可以在视图中的任何地方调用user.fullName(),这样我就可以在整个系统中保持DRY和一致性。

为什么这不起作用,是否有办法让它发挥作用?

模型

module.exports = {
    attributes: {
        email: {
          type: 'string',
          required: true,
          unique: true,
          email: true
        },
        password: {
          type: 'string',
          required: true
        },
        firstName: {
          type: 'string',
          required: false,
          maxLength: 50,
          minLength: 2
        },
        lastName: {
          type: 'string',
          required: false,
          maxLength: 50,
          minLength: 2
        },

        // Returns full name of user (or just first / last if that's all we have)
        getFullName: function(){
          return _.str.trim((this.firstName || '') + ' ' + (this.lastName || ''));
        }
    }
}

查看

<% users.forEach(function(user){ %>
<tr>
  <td><%= user.id %></td>
  <td><%= user.email %></td>
  <td><%= user.getFullName() %></td>
  <td><%= user.status %></td>
  <td><%= user.createdAt %></td>
  <td>
    <a href="#<%= user.id %>" class="btn btn-xs icon-edit"></a>
    <a href="#<%= user.id %>" class="btn btn-xs icon-trash"></a>
  </td>
</tr>
<% }); %>

我还在循环和console.log(用户)中尝试了控制器和视图中的循环之前的console.log(用户),并且当模型传递给视图时,它的显式方法被剥离。我也尝试了构建方法user.toJSON(),我在视图中得到一个未定义的方法错误,但它在控制器中按预期工作。

1 个答案:

答案 0 :(得分:0)

在使用pop()之前,看起来必须在阵列上运行toJSON函数。然后,您将可以访问视图中的属性方法。了解它在sails documentation中的用法。但是,这当然会删除数组中的最后一个元素......