2013-05-02 26 views
3

我的后台是给我这个JSON(例如)填充烬数据表:从WebSocket的

{ 
    id: 0, 
    list: [ 
     {username:'user_1', name:'Name1', surname:'Surname1', user:0}, 
     {username:'user_2', name:'Name2', surname:'Surname2', user:0}, 
     ] 
} 

我有必要引导我的表App.WUser与该类型JSON的。数据来自WebSocket。我的Ember.js模式定义如下:

App.WUser = DS.Model.extend({ 
    list: DS.hasMany('App.User') 
}); 

App.User = DS.Model.extend({ 
    username: DS.attr('string'), // primary key 
    name: DS.attr('string'), 
    surname: DS.attr('string'), 
    user: DS.belongsTo('App.WUser') 
}); 

我编写了我的custum Adapter for WebSocket实现。请注意,App.WebSocketConnection是一个包含连接处理程序的Mixin(请参阅最后一个片段)。

DS.SocketAdapter = DS.RESTAdapter.extend(App.WebSocketConnection, { 
    socket: undefined, 

    init: function() {  
    socket = this.getSocket(); // activate WS connection (see Mixin) 
    this._super(); 
    }, 

    find: function (store, type, id) { 
    // empty block  
    }, 

    findAll: function (store, type) { 
    // empty block 
    }, 

    createRecord: function(store, type, record) { 
    // code not relevant 
    } 
}); 



DS.SocketAdapter.map('App.User', { 
    primaryKey: 'username' 
}); 


DS.SocketAdapter.map('App.WUser', { 
    list: {embedded: 'always'} 
}); 

我的商店

App.Store = DS.Store.extend({ 
    revision: 12, 
    adapter: DS.SocketAdapter.create({}) 
}); 

我的密新:

App.WebSocketHandler = Ember.Object.extend({ 
    uri: 'ws://localhost:8080/App/atmosphere/chat/all', 
    ws: , 

    init: function() { 
    this.ws = new WebSocket(this.uri));                 

    // callbacks 
    this.ws.onopen = function() { 
     console.log('Connection established /all'); 
    }; 
    this.ws.onclone = function() { 
     console.log('Connection closed /' + 'all'); 
    }; 
    this.ws.onmessage = function(data) { 
     alert('New JSON message from server /all ' + data); // <---- ??? 
    }; 

    this._super(); 
    }, 

    send: function(data) { 


    // not relevant method... this method simply send a message to the server 
    /* 
    var some = ... 

    this.ws.send(JSON.stringify(some)); 
    */ 
    } 

}); 

搜索在谷歌,我伸手写这段代码:

var JSONfromWebSocket = { 
    id: 0, 
    list: [ 
    {username:'user_1', name:'Name1', surname:'Surname1', user:0}, 
    {username:'user_2', name:'Name2', surname:'Surname2', user:0}, 
    ] 
}; 
    var store = DS.get('defaultStore'); 
    store.loadMany(App.WUser, [0], JSONfromWebSocket); // should I specify the [0] id? 

    (?) this.didCreateRecords(store, App.WUser, records(?), undefined); // is it a neccessary line? 

问题:

  1. 我在哪里放了我的代码?
  2. 我的一段代码是否正确?这是推翻数据的正确方法吗?
  3. 是否正确使用custum primaryKey?
  4. 考虑到我的客户ID为App.User;调用loadMany()函数是否正确?
  5. 请注意,JSON来自onmessage回调(请参见行`// <---- ???)。如何调用适配器继承的函数之一 - 以及哪些 - (即createRecords),并将JSON数据传递给它?

我有点困惑,但我希望我是在正确的方式......我的问题是粘合我的代码块!

感谢您的耐心等待!

马蒂亚

回答

3

它看起来像你只有一个App.WUser在同一时间。

因此,像这样

App.WebSocketHandler = Ember.Object.extend({ 
    uri: 'ws://localhost:8080/App/atmosphere/chat/all', 
    ws: , 

    init: function() { 
    this.ws = new WebSocket(this.uri));                 

    // callbacks 
    this.ws.onopen = function() { 
     console.log('Connection established /all'); 
    }; 
    this.ws.onclone = function() { 
     console.log('Connection closed /' + 'all'); 
    }; 
    this.ws.onmessage = function(data) { 
     DS.get('defaultStore').load(App.WUser, data); //Simply load your json in the store. 
    }; 

    this._super(); 
    }, 
+0

Thaks这么多!它的作用就像一个魅力:[见链接](http://img689.imageshack.us/img689/9505/snapshot6t.png)。一个问题是我的外键看起来是空的(并且被命名为** user_id **,而不是**用户**)。我认为是因为我在我的Adapter之外序列化了我的记录。 (请注意,我不使用自定义序列化器,我应该吗?) – Mattia 2013-05-03 19:18:01

+0

您想要指定用户在App.Adapter.map('App.WUser',{0128} :'load'} };请参阅https://github.com/emberjs/data/blob/master/packages/ember-data/tests/integration/embedded/embedded_loading_test.js#L92 – 2013-05-03 19:21:49

+0

,您还需要使用'inverse'使得数据可以发现'list'是用户存储的地方。请参阅https://github.com/emberjs/data/blob/master/packages/ember-data/tests/integration/inverse_relationships_test.js# L65 – 2013-05-03 19:23:09