2013-04-28 59 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