在 Parse JS API (backbone.js) 视图模板中呈现的不仅仅是模型属性
Rendering more than just model attributes in Parse JS API (backbone.js) view templates
所以我正在尝试使用连接 table 在我的 Parse 应用程序中显示数据列表。 javascript API 与 backbone.js 非常相似,我假设任何知道的人都可以帮助我。我无法显示我的实际源代码,但我认为我的简单推特式 "user follows user" 场景可以回答我的问题。因此,假设我有一个名为 "follows" 的联接 table,它仅包含自己的 objectId、关系中每个用户的 ID 以及有关关系的一些元数据(需要元数据是我使用的原因连接 table,而不是 Parse.Relation)。我想要一个视图来查找当前用户关注的所有用户,并为每个案例呈现另一个视图的实例。据我目前所知,它看起来像这样。
在顶层视图(我们称之为 AllFollowsView)的初始化中,我会有这样的东西。
var currentUser = Parse.User.current();
var followsQuery = new Parse.Query(Follows);
followsQuery.equalTo("userId", currentUser.id);
followsQuery.find({
success: function(followsResult){
for (var i = 0; i < followsResult.length; i++){
var view = new OneFollowView({model:followsResult[i]});
this.$("#followed-list").append(view.render().el);
}//for loop
},
error: function(error){
console.log("error finding plans query");
}
});
OneFollowsView 只是一个视图,它呈现
显示有关关系的数据并侦听该特定关系的更改(在我的情况下主要是更改或删除)。我了解到通过传入相应的模型
var view = new OneFollowView({model:followsResult[i]});
我可以像这样在 OneFollowsView 模板中打印出该模型的属性
<li>You are following a user with the id of <%= _.escape(followedUserId) %></li>
我的问题是,这只允许我访问存储在 "follows" 对象中的信息。我如何将相应的用户模型(或我可以查询其 ID 的任何其他模型)传递到模板中,以便我可以以相同的方式在 html 中访问它们。我希望能够在其中一个视图中 运行 进行查询,然后在 html 中访问这些模型。我知道我可以在使用该对象作为模型声明较低级别 class 的新实例之前向对象添加属性,但这对我没有帮助,因为我不想保存它并附加新属性.
编辑:我的顶级函数渲染函数目前是空的。它的初始化函数包含这一行来呈现模板。我想这可能应该在渲染函数中,然后我会从初始化调用渲染。
this.$el.html(_.template($("#all-follows-template").html()));
这是下方(个人 li)视图的渲染图
render: function() {
$(this.el).html(this.template(this.model.toJSON()));
return this;
this.delegateEvents();
}
根据我的理解,这只是将模板呈现为 el,同时将模型解析为 JSON,然后 returns 以允许链式调用。
这里的问题出在你的render
方法上。当您在渲染方法中调用 this.template
时。该方法 this.template
是通过调用 _.template
函数返回的模板函数。当您调用 this.template
方法时,您传入的对象的属性将作为实例变量在您的模板中使用。
在您的情况下,您传递的是对象的 JSON。因此,模型的属性成为模板中可用变量的名称。如果您想向模板公开其他变量,您有几个选择:1) 添加到 jsonified 模型的属性。 2) 将模型作为顶级变量和您可能需要的任何其他变量发送。
// option 1
render: function() {
var templateArgs = _.extend(this.model.toJSON(), { additionalVar: 'new var' });
var content = this.template(templateArgs);
$(this.el).html(content);
this.delegateEvents();
return this;
}
// option 2
render: function() {
var templateArgs = {
followResult: this.model.toJSON(),
additionalVar: 'new var'
};
var content = this.template(templateArgs);
$(this.el).html(content);
return this;
this.delegateEvents();
}
两种选择都是合理的。我可能会选择选项 2。它允许您在模板中说类似的话:
<li> <%= followResult.someProperty %> <%= additionalVar %> </li>
希望对您有所帮助。 :)
所以我正在尝试使用连接 table 在我的 Parse 应用程序中显示数据列表。 javascript API 与 backbone.js 非常相似,我假设任何知道的人都可以帮助我。我无法显示我的实际源代码,但我认为我的简单推特式 "user follows user" 场景可以回答我的问题。因此,假设我有一个名为 "follows" 的联接 table,它仅包含自己的 objectId、关系中每个用户的 ID 以及有关关系的一些元数据(需要元数据是我使用的原因连接 table,而不是 Parse.Relation)。我想要一个视图来查找当前用户关注的所有用户,并为每个案例呈现另一个视图的实例。据我目前所知,它看起来像这样。
在顶层视图(我们称之为 AllFollowsView)的初始化中,我会有这样的东西。
var currentUser = Parse.User.current();
var followsQuery = new Parse.Query(Follows);
followsQuery.equalTo("userId", currentUser.id);
followsQuery.find({
success: function(followsResult){
for (var i = 0; i < followsResult.length; i++){
var view = new OneFollowView({model:followsResult[i]});
this.$("#followed-list").append(view.render().el);
}//for loop
},
error: function(error){
console.log("error finding plans query");
}
});
OneFollowsView 只是一个视图,它呈现
var view = new OneFollowView({model:followsResult[i]});
我可以像这样在 OneFollowsView 模板中打印出该模型的属性
<li>You are following a user with the id of <%= _.escape(followedUserId) %></li>
我的问题是,这只允许我访问存储在 "follows" 对象中的信息。我如何将相应的用户模型(或我可以查询其 ID 的任何其他模型)传递到模板中,以便我可以以相同的方式在 html 中访问它们。我希望能够在其中一个视图中 运行 进行查询,然后在 html 中访问这些模型。我知道我可以在使用该对象作为模型声明较低级别 class 的新实例之前向对象添加属性,但这对我没有帮助,因为我不想保存它并附加新属性.
编辑:我的顶级函数渲染函数目前是空的。它的初始化函数包含这一行来呈现模板。我想这可能应该在渲染函数中,然后我会从初始化调用渲染。
this.$el.html(_.template($("#all-follows-template").html()));
这是下方(个人 li)视图的渲染图
render: function() {
$(this.el).html(this.template(this.model.toJSON()));
return this;
this.delegateEvents();
}
根据我的理解,这只是将模板呈现为 el,同时将模型解析为 JSON,然后 returns 以允许链式调用。
这里的问题出在你的render
方法上。当您在渲染方法中调用 this.template
时。该方法 this.template
是通过调用 _.template
函数返回的模板函数。当您调用 this.template
方法时,您传入的对象的属性将作为实例变量在您的模板中使用。
在您的情况下,您传递的是对象的 JSON。因此,模型的属性成为模板中可用变量的名称。如果您想向模板公开其他变量,您有几个选择:1) 添加到 jsonified 模型的属性。 2) 将模型作为顶级变量和您可能需要的任何其他变量发送。
// option 1
render: function() {
var templateArgs = _.extend(this.model.toJSON(), { additionalVar: 'new var' });
var content = this.template(templateArgs);
$(this.el).html(content);
this.delegateEvents();
return this;
}
// option 2
render: function() {
var templateArgs = {
followResult: this.model.toJSON(),
additionalVar: 'new var'
};
var content = this.template(templateArgs);
$(this.el).html(content);
return this;
this.delegateEvents();
}
两种选择都是合理的。我可能会选择选项 2。它允许您在模板中说类似的话:
<li> <%= followResult.someProperty %> <%= additionalVar %> </li>
希望对您有所帮助。 :)