我认为这可以在我的BatmanJS控制器中使用:
project = Project.find parseInt(params.id, 10), (err) ->
throw err if err
@set 'project', project
**@set 'owner_id', project.get("owner_id")**
但是project.get(“owner_id”)始终未定义。我想知道我与Project.find的通话是否错误,因为我认为它与rails非常相似。我做错了什么?
owner_id是项目的一个属性,在视图中有效:
%p{"data-bind" => "owner_id"}
工作并吐出正确的所有者ID。
答案 0 :(得分:1)
与JS中的许多内容一样,Batman.Model.find
是一种异步方法,来自the docs ......
Model.find()
要求模型使用给定callback
的记录调用给定的id
。
所以,这是在你的代码中发生的事情的顺序......
Project.find
,告知Batman.Model
在从数据库检索数据后调用我们的callback
函数。'project'
密钥路径设置为该承诺。#get
(在它有值之前)。find
从数据库返回,因此project
,因此您的'project'
密钥路径会更新项目的值 - 但'owner_id'
仍未定义通过不尝试设置中间密钥路径,但只是直接绑定到视图中模型的属性来解决此问题。
IE中。在你的控制器中有这个......
@set 'project', Project.find parseInt(params.id, 10), (err) -> throw err if err
...然后在你看来......
<p data-bind="project.owner_id"></p>
当项目最终从数据库到达时,该元素将使用owner_id
或者,如果您想在控制器中执行 那个owner_id
值,那么请设置一个密钥路径的观察者,当project
到达时将触发该观察者来自DB,例如
@observe 'project.owner_id', (id) =>
if id
@set 'owner', Owner.find id, (e) -> throw e if e
@set 'project', Project.find parseInt(params.id, 10), (err) -> throw err if err
因此,当Project.find
返回时,它将设置'project'
并依次设置'project.owner_id'
个关键路径,这将触发您的观察者去检索Owner
并设置'owner'
密钥路径。所以现在你可以在你看来......
<h3 data-bind="owner.name"></h3>