BatmanJS和Rails3:在控制器中获取对象属性

时间:2012-08-31 19:37:20

标签: ruby-on-rails-3 batman.js

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

1 个答案:

答案 0 :(得分:1)

与JS中的许多内容一样,Batman.Model.find是一种异步方法,来自the docs ......

  

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

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

  1. 调用Project.find,告知Batman.Model在从数据库检索数据后调用我们的callback函数。
  2. 指定该函数的返回值(这是一种将在稍后中填写的承诺。)
  3. 'project'密钥路径设置为该承诺。
  4. 立即尝试在该承诺上调用#get(在它有值之前)。
  5. 一段时间之后,find从数据库返回,因此project,因此您的'project'密钥路径会更新项目的值 - 但'owner_id'仍未定义
  6. 通过不尝试设置中间密钥路径,但只是直接绑定到视图中模型的属性来解决此问题。

    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>