2014-02-26 60 views
0

我的客戶端API按以下格式返回JSON:Emberjs - 映射JSON建模領域

{ 
    "Result": [ 
     { 
      "member": { 
       "id": 1, 
       "name": "Mark Smith", 
       "email_address": "[email protected]", 
       "member_type": [ 
        "Premium" 
       ], 
       "privileges": [ 
        "MEMBER" 
       ] 
      }, 
      "activites": { 
       "ActivityId": "15", 
       "ActivityName": "Tennie" 
      } 
     } 
    ], 
    "ResultCount": 1 
} 

,我需要映射到我的灰燼應用模型:

App.Member = DS.Model.extend({                    
    memberid:    DS.attr('number'), 
    membername:   DS.attr('string'), 
    memberemail:  DS.attr('string'), 
    membertype:   DS.attr('string'), 
    memberprivileges:   DS.attr('number'), 
    activityID:   DS.attr('number') 
});                           


App.MemberSerializer = DS.RESTSerializer.extend({                 
extractArray: function(store, type, payload, id, requestType){   
... 

我試着實現一個序列化器來映射JSON和應用模型之間的字段,但不知道如何使用extractArray來做到這一點,因爲我找不到任何教程/示例如何這樣做,所以有人請給我提供如何做的例子所以基於我的客戶端JSON結構?

添置我根據詹姆斯做出回覆:

App.ArrayTransform = DS.Transform.extend({ 
    deserialize: function (serialized) { 
    return (Ember.typeOf(serialized) == "array") 
     ? serialized 
     : [] 
    }, 

    serialize: function (deserialized) { 
    var type = Ember.typeOf(deserialized) 
    if (type == 'array') { 
     return deserialized 
    } else if (type == 'string') { 
     return deserialized.split(',').map(function (item) { 
     return jQuery.trim(item) 
     }); 
    } else { 
     return [] 
    } 
    } 
}) 


App.register("transform:array", DS.ArrayTransform); 

App.Member = DS.Model.extend({                    
    cont : DS.attr('array')  
}); 

回答

0

你需要做出修改並使用自己的DS.Model對象數組

/** 
* Configure a transform for DS.Model Arrays 
* DS.attr('array') 
*/ 
App.ArrayTransform = DS.Transform.extend({ 
    deserialize: function (serialized) { 
    return (Ember.typeOf(serialized) == "array") 
     ? serialized 
     : [] 
    }, 

    serialize: function (deserialized) { 
    var type = Ember.typeOf(deserialized) 
    if (type == 'array') { 
     return deserialized 
    } else if (type == 'string') { 
     return deserialized.split(',').map(function (item) { 
     return jQuery.trim(item) 
     }); 
    } else { 
     return [] 
    } 
    } 
}) 
+0

感謝James的回答,我根據您的回答更新了我的問題,並根據我的發現推薦了一些參考文獻註冊變換,但現在錯誤:TypeError:試圖註冊一個未知的工廠:'transform:array' ....如果我刪除變換註冊,我得到另一個錯誤:「加載路由時出錯:undefined」所以​​想什麼我在這裏做錯了,如何解決?感謝您的時間 – MChan

+0

其實你不需要使用DS.Model('數組'),它應該工作正常使用DS.Model() – Jaime

+0

我使用DS.attr('數組')而不是DS.Model '數組'),甚至DS.attr()無論如何我仍然在我以前的評論中提到的錯誤:) – MChan

0

試試這個:

App.Member = DS.Model.extend({                    
    memberid: DS.attr('number'), 
    membername: DS.attr('string'), 
    memberemail: DS.attr('string'), 
    membertype: DS.attr('string'), 
    memberprivileges: DS.attr('number'), 
    activityID: DS.attr('number') 
});                           


App.MemberSerializer = DS.RESTSerializer.extend({ 
    attrs: { 
     memberid: 'id', 
     membername: 'name', 
     memberemail: 'email', 
     membertype: 'type', 
     memberprivileges: 'privileges', 
     activityID: 'ActivityId' 
    } 
});