Marionette异步模型取出不按预期工作

时间:2013-11-17 20:08:06

标签: backbone.js asynchronous coffeescript marionette

我遇到了一个奇怪的问题。我有一个负责获取数据的Marionette模块,它通过Backbone.Wreqr请求/响应系统公开。对于我的项目,它看起来像这样(CoffeeScript):

@App.module 'Entities', (Entities, App, Backbone, Marionette, $, _) ->

    class Entities.Project extends Backbone.Model
        urlRoot: '/api/project'

    class Entities.ProjectsCollection extends Backbone.Collection
        model: Entities.Project
        url: '/api/projects.json'

    API =
        getProjectEntities: ->
            projects = new Entities.ProjectsCollection
            projects.fetch()
            projects

        getProject: (project) ->
            project = new Entities.Project({ id: project });
            project.fetch()
            project


    App.reqres.setHandler 'project:entities', ->
        API.getProjectEntities()

    App.reqres.setHandler 'project:entity', (project) ->
        API.getProject(project)

对于集合,这完全按预期工作。提取数据,当我将其传递给Marionette.CompositeView时,视图呈现得很好。

我现在正在为这些项目充实一个详细页面,而且一切都不顺利。当我通过实例化新模型currentProject = App.request 'project:entity', project来请求特定模型,然后将其传递给Marionette.ItemView时,ItemView会在获取模型之前解析其模板,从而导致Uncaught reference error因为我的模板中的变量还没有被宣布...知道这里发生了什么吗?

我的模板现在非常简单:

    <script id="project_detail_template" type="text/template">
        <h1>Hello world!</h1>
        <p><%= title %></p>
    </script>

编辑:好吧,显然我在这里犯了更多错误,因为当我将这个模型注销到控制台时,它所有的属性都是id。如果有人能让我朝着正确的方向发展,那将是伟大的。

1 个答案:

答案 0 :(得分:1)

您正在调用fetch,然后立即返回project对象,而不必等待异步fetch完成。

不返回project对象,而是返回project.fetch(),因为这将返回一个承诺。然后你可以.then值,确保它可用:


@App.module 'Entities', (Entities, App, Backbone, Marionette, $, _) ->

    class Entities.Project extends Backbone.Model
        urlRoot: '/api/project'

    class Entities.ProjectsCollection extends Backbone.Collection
        model: Entities.Project
        url: '/api/projects.json'

    API =
        getProjectEntities: ->
            projects = new Entities.ProjectsCollection
            projects.fetch()

        getProject: (project) ->
            project = new Entities.Project({ id: project });
            project.fetch()


    App.reqres.setHandler 'project:entities', ->
        API.getProjectEntities()

    App.reqres.setHandler 'project:entity', (project) ->
        API.getProject(project)

通过reqres进行通话时,您将收到回复。


App.request("project:entity", someId, function (promise){

  // wait for the project to finish loading

  $.when(promise).then(function(project){
    // do stuff with your project, here
  });

});