簡體   English   中英

Ember JS,在狀態為root.loaded.updated.uncommitted的Transformer handeling事件`didCommit`中解析數據時出錯。“

[英]Ember JS, Error while parsing Data in Transformer handeling event `didCommit` in state root.loaded.updated.uncommitted."

我在Ember Transformer中嘗試在序列化函數中解析日期時收到錯誤。

錯誤消息:“在狀態root.loaded.updated.uncommitted中嘗試處理<(DS.Model的子類)上的事件didCommit :ember1597:8260357>。”

奇怪的是,數據被正確傳輸解析到服務器。

碼:

DS.Transform.extend({

    deserialize : function(serialized) {

        var array = [];

        if (Ember.isArray(serialized)) {

            serialized.forEach(function(item) {
                if (item.feldTyp === "DATE_FIELD" && item.value) {
                    Ember.set(item, "value", moment(item.value, "DD.MM.YYYY"));
                }
                array.addObject(Ember.Object.create(item));
            });
        }

        return array;
    },

    serialize : function(deserialized) {
        if (Ember.isArray(deserialized)) {
            deserialized.forEach(function(item) {
                if (item.get('feldTyp') === "DATE_FIELD" && item.get('value')) {
                    item.set('value', moment(item.get('value')).format("DD.MM.YYYY"));
                }
            });
            return deserialized;
        }

        return [];
    }
});

item.set('value', moment(item.get('value')).format("DD.MM.YYYY")); 導致錯誤被注釋掉錯誤消失。 我嘗試了其他一些事情,比如設置靜態值或使用Ember.set設置值但沒有成功。 我不太清楚這里出了什么問題,因此無法想出解決方案。 有人可以幫忙嗎? 提前致謝。

編輯

解決方法:我將序列化移動到控制器中。 看起來不那么優雅,但現在起作用......

正如你所知,ember數據不喜歡在變換中使用set 因為數據的服務器表示通常不同於它在客戶端表示的方式。 Ember希望轉換不會修改傳入的serializeddeserialized serialized值,而是返回新值。

發生此錯誤的原因是因為ember有一個狀態機來跟蹤與服務器相關的記錄狀態(請參閱http://emberjs.com/api/data/classes/DS.RootState.html )。 在這種情況下,ember很可能將記錄置於inFlight狀態。 然后它調用transform的serialize函數。 item.set ,ember會注意到對記錄的更改,並且無意中將記錄轉換回uncommitted狀態。 之后,服務器響應保存請求燼誤假設成績仍然是在inFlight狀態信號didCommit事件,這樣的記錄可以轉移到saved狀態。 因為uncommitted狀態不支持didCommit事件,所以ember會拋出錯誤。

我懷疑你可以通過重寫你的序列化函數來解決這個問題,而不是調用set而是返回一個新的數組。

    serialize : function(deserialized) {
        if (Ember.isArray(deserialized)) {
            return deserialized.map(function(item) {
                if (item.get('feldTyp') === "DATE_FIELD" && item.get('value')) {
                    return moment(item.get('value')).format("DD.MM.YYYY");
                }
            });
        }

        return [];
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM