1

我认为这将在我的 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。

4

1 回答 1

1

像 JS 中的许多东西一样,Batman.Model.find是一种异步方法,来自docs ...

Model.find()要求模型使用给定callback的记录调用给定id

所以,这是代码中发生的事情的顺序......

  1. CallProject.find告诉我们在从数据库中检索数据后Batman.Model调用我们的函数。callback
  2. 分配该函数的返回值(这是一种稍后将填写的承诺)。
  3. 设置该'project'承诺的关键路径。
  4. 立即尝试调用#get该承诺(在它具有价值之前)。
  5. 一段时间后,find来自数据库的返回project等因此您的'project'keypath 将使用您的项目的值进行更新 - 但'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值执行某些操作,则为 keypath 设置一个观察者,该观察者将在project从数据库到达时触发,例如。

@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返回时,它将设置keypaths'project'并依次设置'project.owner_id'​​keypaths,这将触发您的观察者去检索Owner并设置'owner'keypaths。所以现在你可以在你的视野中......

<h3 data-bind="owner.name"></h3>
于 2012-08-31T20:30:46.670 回答