在 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>
    

    希望对您有所帮助。 :)