【问题标题】:Access model instance methods in view (Sails.js / EJS)访问视图中的模型实例方法(Sails.js / EJS)
【发布时间】:2014-03-30 04:12:06
【问题描述】:

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

例子:

我的用户模型有方法 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(user),在控制器和视图中的循环之前尝试了 console.log(users),很明显,当模型传递给视图时,方法被剥离了。我还尝试了内置方法 user.toJSON() 并在视图中收到未定义的方法错误,但它在控制器中按预期工作。

【问题讨论】:

  • 为我工作。你能发布你的模型和视图代码吗?
  • 另外:您使用的是哪个版本的 Sails?
  • v0.10 ...我认为这与我的模型或视图代码没有任何关系,因为即使内置函数 toJSON() 也不起作用。此外,如果我 console.log 控制器上的整个用户对象和视图,则关联的 getter/setter 也会被删除。
  • @marionebl 我添加了模型/视图代码。虽然,也没什么特别的。我可以通过 console.log 告诉用户对象在控制器中是完整的,但是当它到达视图时方法被剥离。
  • 无法在此test application 中重现。尝试在sails lift 之后访问localhost:1337/test/test

标签: javascript node.js sails.js ejs


【解决方案1】:

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

【讨论】:

  • 我没有在数组上调用 .toJSON,而是在 forEach 循环中的各个实例上执行此操作。顺便说一句,如果你只想要一个并且不想修改数组,你可以使用 users[0].toJSON()
猜你喜欢
  • 2013-07-15
  • 1970-01-01
  • 2023-03-14
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 2013-11-18
  • 2015-01-26
相关资源
最近更新 更多