2013-04-28 47 views
3

我刚开始使用Ember.js,并且想要实现一个非常简单的流程。何时调用createRecord以及如何处理商店交易

在总览屏幕上,我有一个新按钮,允许用户添加记录。保存后,用户返回到概览屏幕,在屏幕上他可以看到概览中新创建的记录。

用户导航到使用linkTo

{{#linkTo locations.new}} Insert location {{/linkTo}} 

这触发其中准备了新的模式,以便它可以绑定到屏幕下面的路线“新记录”页面。

App.LocationsNewRoute = Ember.Route.extend({ 
    model: function() { 
    return App.Location.createRecord(); 
    } 
}); 

新位置的屏幕车把模板看起来是这样的:

<script type="text/x-handlebars" data-template-name="locations/new"> 
    <h1>New location</h1> 
    Latitude : {{view Ember.TextField valueBinding="latitude"}} 
    Longitude : {{view Ember.TextField valueBinding="longitude"}} 
    <p><button {{action addItem this}}>Add record</button></p> 
</script> 

如addItem实现这样的:

App.LocationsNewController = Ember.ObjectController.extend({ 
    addItem: function(location) { 
    this.get("store").commit(); 
    this.get("target").transitionTo("locations"); 

    } 
}); 

一对夫妇的问题,我有这个遭遇:

模特商店交易

  • 只要用户导航(使用linkTo)到新的位置页面,就会创建一个空记录(使用createRecord)。我相信这是将控件绑定到模型所必需的。
  • 我注意到,当用户填入纬度,但决定返回到概述(使用linkTo)时,部分填充的模型将被放入概述中。
  • 刷新页面删除部分填充物

在Ember.js工作时...过渡到通过linkTo一条新的路径,并刷新在浏览器之间的区别是,我注意到这个有很多有时巨大。

问题:我需要使用什么模式来实现“添加新记录”流程。我只是想导航到一个新的屏幕,并有一个保存/取消按钮。我只想点击保存时添加的记录。应该只在单击Save时调用createRecord,但是如何绑定控件?

模式复制

当我的REST的服务做一个POST后返回以下(非ember.js标准)JSON(添加记录):

{ 
    "latitude": "1.123", 
    "longitude": "1.123", 
    "accuracy": null, 
    "_id": "517d2dcf377dcffc11000009" 
} 

我有以下行为:

  • 当用户填入纬度/经度并点击保存按钮时,他返回到总览以查找其新创建的记录在概述中两次。
  • 单击保存后,控制台中显示一个错误:您的服务器返回了一个具有键纬度的散列,但您没有映射。
  • 刷新页面摆脱了重复。

我能够做一个POST

{ 
    "location": { 
    "latitude": "1.123", 
    "longitude": "1.123", 
    "accuracy": null, 
    "_id": "517d31457b40fcbc2a000003" 
    } 
} 

该应用程序后返回ember.js标准JSON来解决这个配置为我使用MongoDB的使用_id作为主键。

App.Adapter = DS.RESTAdapter.extend({ 
    serializer: DS.RESTSerializer.extend({ 
    primaryKey: function (type){ 
     return '_id'; 
    } 
    }) 
}); 

现在我可以理解为什么Ember.js抱怨纬度键(因为它是期待一个位置的根元素),但我不明白为什么它增加了模型两次集合(只使用1 POST)

所以2个问题:

  • 什么是错我的流量,我该如何解决?
  • 当REST API返回非ember.js标准JSON时,为什么最终会出现重复内容。
+0

你在你的序列化'_id'配置'primaryKey'? – MilkyWayJoe 2013-04-28 16:47:58

+0

你有没有找到解决这个问题的方法?我想我遇到类似的问题http://stackoverflow.com/questions/16670855/uncommitted-record-still-present-after-rollback – 2013-05-22 13:06:23

回答

1

示范店交易

总结你的创作进入一个新的事务。这不会阻止记录在列表中显示(您可以随时过滤列表以拒绝新记录)。在您的路由器中,退出状态时可以回滚事务。喜欢的东西:

App.LocationsNewRoute = Ember.Route.extend({ 
    activate: function() { 
    this.transaction = DS.defaultStore.transaction(), 
    }, 

    model: function() { 
    return this.transaction.createRecord(App.Location); 
    } 
}); 

在你save处理程序,要提交该记录的事务(而不是商店的默认之一)。

更新:不要deactivate

型号回滚复制

“你的服务器的关键纬度返回哈希,但你有没有映射它。” Ember数据试图对您在JSON中返回的每个属性/关键字进行副作用。 Ember数据期望返回的对象位于JSON的根键下(正如您已经注意到的那样)。

我不知道你为什么有重复。

更新2:如何才能不显示新创建的记录

我说错了话在我的意见,在一个事务中创建的记录属于由find返回的数组。我忘了,我已经更新了我的代码做到这一点:

App.LocationsController = Ember.ArrayController.extend({ 
    persisted: function() { 
    return this.get('arrangedContent').filter(function(contact) { 
     if(!contact.get('isNew')) { 
     return true; 
     } 
    }); 
    }.property('[email protected]', 'arrangedContent') 
}) 

,然后在模板:

{{#each persisted}} 
    // whatever you need 
{{/each}} 
+0

Ember.JS“新记录”页面是否真的迫使你实际创建新纪录?过滤是否真的必要,如果是这样,我该如何过滤?似乎很奇怪......如果用户在我的“新纪录”按钮上点击100次,我不想在我的交易中有100个空物件。 – ddewaele 2013-04-28 22:15:46

+0

如果记录尚未保存,您可以在'deactivate'中回滚事务 – MilkyWayJoe 2013-04-28 23:18:15

+0

尝试了解决方案,虽然在从LocationsNewRoute路径导航时调用停用,但返回到LocationsIndexRoute时,App.location.find()方法仍然返回正在处理(但不保存)位置/新模板中的项目。 – ddewaele 2013-04-29 06:44:29