2015-02-09 54 views
0

所以我有這樣的要求,當我去whitelist路線時,我從API獲取白名單用戶列表。我的模型和序列化是這樣的:Ember CLI:在商店中推送自定義記錄

型號/ whitelist.js

import BaseUser from './base-user'; 
var Whitelist = BaseUser.extend({}); 
export default Whitelist; 

型號/基user.js的

import Ember from 'ember'; 
import DS from 'ember-data'; 

var attr = DS.attr; 

export default DS.Model.extend({ 
    name: attr(), 
    username: attr(), 
    description: attr(), 
    profilePicture: attr(), 
    followersCount: attr(), 
    followsCount: attr(), 
    postCount: attr(), 
    verified: attr(), 
    following: attr('boolean'), 
    whitelisted: attr('boolean'), 
    blacklisted: attr('boolean'), 
    unfollow: followUnfollow, 
    follow: followUnfollow, 
    whitelist: whitelist, 
    unwhitelist: unWhitelist, 
    blacklist: blacklist, 
    unblacklist: unBlacklist, 
    reply: reply, 
    getLists: getLists, 
    createdAt: attr() 
}); 

串行器/ base.js

import DS from 'ember-data'; 

var serializeCollection = function(store, type, payload, id, requestType) { 
    payload.records = payload.records ? payload.records : []; 
    var users = payload.records.map(function(record) { 
    record = record.user ? record.user : record; 
    var user = { 
     id: record.id, 
     name: record.name || record.fullName, 
     username: record.screenName || record.username, 
     description: record.description || record.bio, 
     profilePicture: record.profileImageURLHttps || record.profilePicture, 
     followersCount: record.followersCount, 
     followsCount: record.friendsCount || record.followsCount, 
     postCount: record.statusesCount || 0, 
     verified: record.verified || false, 
     createdAt: record.createdAt || false 
    }; 
    return user; 
    }); 
    return users; 
}; 

export default DS.RESTSerializer.extend({ 
    extractFindAll: serializeCollection, 
    extractFindQuery: serializeCollection 
}); 

serializers/whitelist.js

import Ember from 'ember'; 
import Base from './base'; 


var serializeCollection = function(store, type, payload, id, requestType) { 
    /* Here payload is of the form: 
    * { 
    * cursor: null, 
    * records: [{ 
    *  user: {} 
    *  friendship: {} 
    * }] 
    * } 
    */ 
    var data = this._super(store, type, payload, id, requestType); 
    return data.map(function(item) { 
    return Ember.$.extend(item, { 
     following: true, 
     whitelisted: true, 
     blacklisted: false 
    }); 
    }); 
}; 

export default Base.extend({ 
    extractFindAll: serializeCollection, 
    extractFindQuery: serializeCollection 
}); 

現在基於一些動作,我在控制器中獲取一個新的記錄是這樣的:

actions: { 
    addToWhitelist: function() { 
    var _this = this; 
    Ember.$.get(url).then(function(data) { 
     /* 
     *The data here is in this form 
     * { 
     * frienship: {}, 
     * user: {} 
     * } 
     */ 

     //What should I do here so that my serializers get called? 

    }); 
    return false; 
    } 
} 

我應該怎麼做,這樣我可以把記錄到我已經填充店,使得串行會被稱爲,首先whitelist序列化程序,然後從它內部,application序列化程序?

回答

0

您不應該使用Ember.$.get受益於ember-data。您可能需要按以下方式創建記錄:

actions: { 
    addToWhitelist: function() { 
    var record = this.store.createRecord('whitelist', { /* your record */ }); 
    record.save().then(function() { 
     // here's after the POST/PUT requests were done 
    }); 
    } 
} 

這對您有幫助嗎?

+0

的問題是,API不是RESTful的。所以我不能做一個帖子請求。我做了一個GET請求。這樣可以節省我想要保存在服務器上的數據,並返回一個我想推送到我的商店的對象(使它穿過串行器後)。說得通? – 2015-02-09 11:10:23

+0

它的確很有意義! :)你可以使用'DS.Adapter'並重寫'createRecord'和'updateRecord'方法。您只需複製並粘貼現有的'createRecord'並根據你的需要調整它:https://github.com/emberjs/data/blob/v1.0.0-beta.14.1/packages/ember-data/lib/adapters/rest_adapter.js#L469 – andrusieczko 2015-02-09 12:20:26

+0

雖然這可以是一種方式,當然,您是否知道我是否可以通過某種方式將從我的請求中獲得的原始數據推送到我的商店中,並確保它是序列化的? – 2015-02-09 12:42:14

1

雖然ED和我都會建議你使用REST API。但有時候你可能無法控制你的API。

Ember.Store.pushPayload是你在找什麼。此方法接受正確格式的原始JSON數據並將其推送到本地商店模型。

爲你工作示例可能看起來像

actions: { 
    addToWhitelist: function() { 
    var self = this; 
    Ember.$.get(url).then(function(data) { 
     self.store.pushPayload(data); 
    }); 
    return false; 
    } 
} 
+0

此外,您可以添加模型名稱作爲第一個參數,讓Ember數據確定將使用哪個序列化程序'self.store.pushPayload('friendship',data);' – jcbvm 2015-02-09 20:49:29

+0

@sushant @jcbvm所以是的,我嘗試了這種技術,因爲我的模型名稱是'whitelist',所以我調用'self.store.pushPayload('whitelist',data)'。然而,由於我的'data'是一個普通對象,它的鍵爲'user'和'friendship',所以我在控制檯上看到一條消息,表示有效載荷中有Encountered user,但沒有找到model「user」的模型。我添加了註釋以顯示我的控制器和序列化程序中的數據形式。 – 2015-02-10 05:35:59

+0

@KaranThakkar,但不得不嘗試我已經發布。不指定模型名稱,但使用直接推式store.pushPayload(數據);讓我知道這是否工作 – Sushant 2015-02-10 06:46:36