【发布时间】: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