0

我对 ember.js 还比较陌生,学习它仍然很痛苦。我正在使用 ember-rails gem,并将 Rails 用作 JSON API。

首先,我只是想构建一个能够显示记录列表(在本例中为电子邮件)的东西,并且能够添加新记录。我有 UI 设置和功能,并且 ember 正在从 Rails API 中提取电子邮件列表。我可以单击电子邮件标题,然后将我带到完整的电子邮件等。

我的问题是添加新记录。我设置了撰写电子邮件表单,但在路由器和控制器中重新安排代码几天后,我仍然没有设法添加新记录。我发现的每个示例似乎都暗示了一种处理事务的不同方式,createRecords、.get('store')、.get('content'),然后通过某种操作提交详细信息。他们都没有为我工作。这是我最接近的感觉:

店铺

App.Adapter = DS.RESTAdapter.extend
  serializer: DS.RESTSerializer.extend
    primaryKey: (type) -> '_id'

App.Store = DS.Store.extend
  revision: 11
  adapter: 'App.Adapter'

电子邮件模型

App.Email = DS.Model.extend 
  from: DS.attr('string')
  to: DS.attr('string')
  subject: DS.attr('string')
  body: DS.attr('string')
  created_at: DS.attr('string')

编写路线

App.ComposeRoute = Ember.Route.extend
model: () ->
   transaction = this.get('store').transaction()
   email = transaction.createRecord(App.Email, {})
   return email

events: {
   save: (email) ->
     email.get('store').transaction()
}

撰写模板(修剪一些 HTML)

<label class="control-label" for="to">To</label>
  {{view Ember.TextField valueBinding="to" id="to" placeholder="Your friend" required="true"}}
<label class="control-label" for="subject">Subject</label>
  {{view Ember.TextField valueBinding="subject" id="subject" placeholder="What's it about?" required="true"}}
<label class="control-label" for="notes">Your message</label>
  {{view Ember.TextArea valueBinding="body" id="body" placeholder="Your message"}}
<button class="btn btn-primary btn-large" {{action save this}}>Send email</button>

Rails emails_controller.rb

class EmailsController < ApplicationController
  # GET /emails.json
  def index
    render json: Email.all
  end

  # GET /emails/1.json
  def show
    email = Email.find(params[:id])
    render json: email
  end

  # POST /emails.json
  def create
    email = Email.new(params[:email])
    email.save
    render json: email, status: :created
  end

因此,使用上面的代码,我填写了文本框,单击提交按钮,似乎没有任何反应。但是,如果我回到我的收件箱页面,我可以看到我刚刚添加的记录(哇哦!),但它并没有通过 Rails 保留(hrmmm)——只要我刷新它就消失了。查看 Rails 日志,ember 似乎没有向 Rails 发送任何内容。

我觉得我只是在各种博客文章中尝试不同的行,而没有真正了解基本过程。我应该怎么做?我通读了 Ember 文档,虽然它们解释了基本概念,但使用 RESTAdapter 的工作示例很少。

4

2 回答 2

2

您从未commit在代码中的任何地方调用过。请记住,store.transaction()这只给您一个事务实例,但您仍然必须commit(或rollbackRoute#deactivate,如果用户离开该路线)。你可能想像这样做你的路线:

App.ComposeRoute = Ember.Route.extend
  model: ->
   transaction = this.get('store').transaction()
   transaction.createRecord(App.Email, {})

  deactivate: ->
    ## not super sure about modelFor in this case, but I think it should work
    record = @modelFor('email')
    ## There's more to check here, like is record 'inflight' and all
    ## but you get the idea.
    if ((record.get('isNew')) or (record.get('isDirty')))
      @get('store.defaultTransaction').rollback()

  events: {
   save: (email) ->
      @get('store.defaultTransaction').commit()
      ## or @get('store').commit()
  }
于 2013-05-07T13:40:29.407 回答
1

您保存记录的方式仍然不正确。

您为您的电子邮件创建一个新事务,这是您要提交的事务,而不是商店的事务。

App.ComposeRoute = Ember.Route.extend
model: () ->
   transaction = this.get('store').transaction()
   email = transaction.createRecord(App.Email, {})
   return email

events: {
   save: (email) ->
     // email.get('store').transaction() //This is only creating a new transaction
     // @get('store.defaultTransaction').commit() // this is committing the store's transaction
     email.get('transaction').commit()
}
于 2013-05-07T14:39:22.110 回答