Javascript Backbone.js应用程序方法不太可扩展-嵌套视图

Javascript Backbone.js应用程序方法不太可扩展-嵌套视图,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我正在创建一个主干应用程序,尽管一切似乎都正常,但如果我继续使用这种方法添加功能和视图,恐怕我可能需要很快进行重构。 我在后端使用,这意味着对象解析相当于Backbone.Model。 我无法控制我的模型,因为它们已经针对移动设备进行了优化,这里我只需要显示3种不同模型的某些关键值 虽然没什么错,但我开始犯“更大”的错误只是时间问题 这是我的路由器: 鉴于在中创建对象的方式,我需要访问3个不同的对象,这就是为什么我要部分渲染视图。 我希望此函数仅呈现一个包含这些“子视图”的完整故事视图,但我不确

我正在创建一个主干应用程序,尽管一切似乎都正常,但如果我继续使用这种方法添加功能和视图,恐怕我可能需要很快进行重构。 我在后端使用,这意味着对象解析相当于Backbone.Model。 我无法控制我的模型,因为它们已经针对移动设备进行了优化,这里我只需要显示3种不同模型的某些关键值

虽然没什么错,但我开始犯“更大”的错误只是时间问题

这是我的路由器:

鉴于在中创建对象的方式,我需要访问3个不同的对象,这就是为什么我要部分渲染视图。 我希望此函数仅呈现一个包含这些“子视图”的完整故事视图,但我不确定如何进行此操作,因为解析。对象需要引用另一个对象->var user=new Parse。用户{objectId:idUser};其中idUser是来自另一个对象的密钥

最后,我的看法是:


你走错了路。您的路由器应该是几行代码,以进行初始查看/收集,并可能执行提取调用。大多数功能应该在您的视图中

你的路由器应该这样做

fullStory: function(id){
     var self = this;
     var query = new Parse.Query(Steps);// not sure what this does
     query.equalTo("story", id) // This does nothing!
     var stepsCollection = query.collection();
     var stepsView = new App.View.Steps({collection: stepsCollection});
     stepsCollection.fetch() // you could also do this in initialize()
}
现在您需要知道的是collection.fetch会在集合上触发一个“reset”事件,该事件会出现在视图中,您可以在视图中处理它。因此,请在视图中侦听并处理“重置”事件,然后重新渲染:

App.Views.Steps = Backbone.View.extend({
  tagName : "ul",
  className: "steps",
  initialize: function() {
      this.bindAll(this, 'render');
    this.collection.bind('reset', this.render);
  },
  render: function() {
    this.$el.html(_.template($("#story_steps").html())({ collection: this.collection }));
    $('#steps_wrapper').html(this.el);
  },
});
请记住,StepsView负责渲染和处理步骤(无论它们是什么)及其各自的模型/集合的事件。用户名视图负责呈现和处理与用户名有关的所有内容。目前,所有的责任都在路由器中实现,这种方法是完全错误的

我想问你是否需要用户名和标题的单独视图——它们应该作为更广泛视图模板的一部分呈现出来——而不是它们自己的视图——它们什么都不做

我感觉到你闻到了什么不对劲,这就是为什么你发布了你的问题。我会进行一次重要的重构-让你的路由器降到几行。。。您的观点将始终是主干中最大的类

如果您想快速确定主干,我强烈推荐优秀的peepcode屏幕广播:


你将在大约3个小时内了解一切,花30美元你就搞错了。您的路由器应该是几行代码,以进行初始查看/收集,并可能执行提取调用。大多数功能应该在您的视图中

你的路由器应该这样做

fullStory: function(id){
     var self = this;
     var query = new Parse.Query(Steps);// not sure what this does
     query.equalTo("story", id) // This does nothing!
     var stepsCollection = query.collection();
     var stepsView = new App.View.Steps({collection: stepsCollection});
     stepsCollection.fetch() // you could also do this in initialize()
}
现在您需要知道的是collection.fetch会在集合上触发一个“reset”事件,该事件会出现在视图中,您可以在视图中处理它。因此,请在视图中侦听并处理“重置”事件,然后重新渲染:

App.Views.Steps = Backbone.View.extend({
  tagName : "ul",
  className: "steps",
  initialize: function() {
      this.bindAll(this, 'render');
    this.collection.bind('reset', this.render);
  },
  render: function() {
    this.$el.html(_.template($("#story_steps").html())({ collection: this.collection }));
    $('#steps_wrapper').html(this.el);
  },
});
请记住,StepsView负责渲染和处理步骤(无论它们是什么)及其各自的模型/集合的事件。用户名视图负责呈现和处理与用户名有关的所有内容。目前,所有的责任都在路由器中实现,这种方法是完全错误的

我想问你是否需要用户名和标题的单独视图——它们应该作为更广泛视图模板的一部分呈现出来——而不是它们自己的视图——它们什么都不做

我感觉到你闻到了什么不对劲,这就是为什么你发布了你的问题。我会进行一次重要的重构-让你的路由器降到几行。。。您的观点将始终是主干中最大的类

如果您想快速确定主干,我强烈推荐优秀的peepcode屏幕广播:


您将在大约3小时内了解所有内容,只需30美元,非常感谢!我没想到会有这么好的回答。你真的理解我的问题。我不确定这是怎么回事,这就是为什么我发布了这个问题。。谢谢你给我指路!真的很感激!我没想到会有这么好的回答。你真的理解我的问题。我不确定这是怎么回事,这就是为什么我发布了这个问题。。谢谢你给我指路!