我遇到了一个奇怪的问题。我有一个负责获取数据的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
。如果有人能让我朝着正确的方向发展,那将是伟大的。
答案 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
});
});