Javascript BackboneJs:如何在页面标记中引导数据,何时将数据分配给集合

Javascript BackboneJs:如何在页面标记中引导数据,何时将数据分配给集合,javascript,asp.net-mvc,backbone.js,Javascript,Asp.net Mvc,Backbone.js,所以, 构建使用多个(目前为2个)全局集合的应用程序, 它是一个文档和患者的目录,它们之间有关系,但与1个文档或属于1个患者的文档列表不同,因此它们实际上是2个独立的集合 我的应用程序是在模块系统中构建的,非常类似于此处所述: backbone.js文档中提到了引导,要做到这一点 <script> Accounts.reset(<%= @accounts.to_json %>); </script> Accounts.reset(); 这是在Rai

所以, 构建使用多个(目前为2个)全局集合的应用程序, 它是一个文档和患者的目录,它们之间有关系,但与1个文档或属于1个患者的文档列表不同,因此它们实际上是2个独立的集合

我的应用程序是在模块系统中构建的,非常类似于此处所述:

backbone.js文档中提到了引导,要做到这一点

<script>
  Accounts.reset(<%= @accounts.to_json %>);
</script>

Accounts.reset();
这是在Rails应用程序中,但是我需要在asp.net MVC3中进行不同的操作,很可能我只需要打印json字符串,而不使用razor视图引擎样式)

但我的问题是

帐户。重置(…数据…)只是漂浮在我的标记中的某个地方,它在我的模块系统中没有很好的结构,难道没有一种方法可以很好地做到这一点吗?
我在哪里可以从模块中获取数据

另一个附带问题是,假设我的主干应用程序中有一条路由


如果有人直接调用此链接,我的应用程序是否会在路由本身执行之前及时准备好数据(来自引导)?

我倾向于设置
应用程序
对象-一个封装启动我的应用程序所需的所有代码的对象。然后,我将参数带入该对象的构造函数中,以便app对象可以使用这些参数。将预加载的JSON数据传递到app对象中是我要做的事情之一,以保持代码的正常和封装

通常是这样的:

MyApp = (function(Backbone, _){
  var MyModel = Backbone.Model.extend({});

  var MyCollection = Backbone.Collection.extend({
    model: MyModel
  });

  var MyView = Backbone.View.extend({
    initialize: function(){
      this.collection.bind("reset", this.render, this);
    },

    render: function(){
      // do stuff with the collection here
    }
  });

  var myApp = function(initialModels){
    this.start = function(){
      this.models = new MyCollection();
      this.myView = new MyView({collection: this.models});
      this.models.reset(initialModels);  
    };
  };

  return myApp;
})(Backbone, _);
然后在我需要启动应用程序的页面中,我执行以下操作:

<script language="javascript">
  var myApp = new MyApp(<%= mymodels.to_json %>);
  myApp.start();
</script>

var myApp=新的myApp();
myApp.start();

当然,这是rails版本。只要用ASP.NET MVC中Razor语法的版本替换

如果在Rails上:除了Derick answer,您可能还想使用它“在js中获取Rails变量”

然后,您可以这样初始化应用程序:

<script language="javascript">
  var myApp = new MyApp(gon.mymodels);
  myApp.start();
</script>

var myApp=新的myApp(gon.mymodels);
myApp.start();

德里克的优秀例子!对于MVC 3+使用以下语法:

<script language="javascript">
  var myApp = new MyApp( @Html.Raw(Json.Encode(Model)) );
  myApp.start();
</script>

var myApp=newmyapp(@Html.Raw(Json.Encode(Model));
myApp.start();

我不是backbone.js专家,但我编写了一个简单的JSFIDLE来实现这种类型的引导,尽管有点不同。基本上,当我初始化视图时,它会创建集合并调用Collection.refresh()。因此,无论我在何处创建视图,它都会自动初始化其数据…或根据您的措辞进行引导。这里是指向JsFiddle的链接:好主意,但正如我在主干文档中读到的,在页面加载时不需要使用fetch(或者像刷新集合一样)。为什么要使用第二个连接来获取所有数据,而您可以立即将其与页面一起发送呢。我想知道的是,我现在这样做的方式是否是使用html的最佳方式。。。现在,它只是插入一个脚本标记,添加一整堆json数据,我当然会在初始化集合后删除这些数据。但是,由于您的json来自外部源,您不能在示例中使用我的技术,因此使用collection.refresh()将是最好的。js被写入与RESTful端点的接口,它通过将集合绑定到用于检索/刷新集合的REST端点来实现这一点。虽然你可以按照你想要的方式引导事情,正如你从得到的答案中看到的那样,但这并不像你想象的那样普遍。backbone.js等的目的是将UI/视图与数据本身分离,因此在我的经验中,我只传递样板HTML来加载我的backbone.js,然后它将执行检索/刷新/管理基于REST的对象的工作。“每个人都有自己的。”:)杰里米,我100%同意你的看法,但是主干文档确实推荐了他所说的。虽然使用一个单独的XHR请求来加载内容是“浪费的”,但如果您认为这是如何在页面上加载每个图像、CSS文档和远程脚本的话,这也没有什么关系。使用初始提取还可以简化您的工作流程。如果您使用服务器端缓存机制来处理XHR请求,这一点尤其正确。好的,感谢您的更新,它看起来与我所做的非常相似,只是我将所有代码都保留在javascript文件中,唯一让我不舒服的是我在视图中留下的小脚本标记,带有window.bootstrap.documents=@myModelsJsonObj;只是以后在我的document ready语句中使用它,就像您直接提交一样。但我明白了,这是我将不得不忍受的痛苦,因为我想我的脚本将从视图文件中删除。