ember.js websocket store

ember.js - aserrado Unkeught TypeError: undefined no es una función cuando se carga en la tienda



websocket store (1)

Estoy usando Ember para mostrar los datos recibidos de mi servidor de Golang. Los datos están en formato JSON. así que abrí un websocket e intenté enviar el mensaje recibido en la tienda, pero recibí este error: UnEught TypeError: undefined no es una función

esta es mi app.js:

App = Ember.Application.create({ LOG_TRANSITIONS: true }) /******************************* Post Template **************************************/ //Define a route for the template "post" App.Router.map(function() { this.route("post", { path: "/post" }); }); //Post Model App.Post = DS.Model.extend({ name: DS.attr(''string'' ), number: DS.attr(''string'') }); DS.SocketAdapterMixin = Ember.Mixin.create({ uri: ''ws://localhost:8081/'', 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) { this.get(''store'').load(App.Post, data) console.log(data); }; this._super(); }, initialize: function() { console.log(''SocketAdapterMixin::initialize''); this._super(); } }); DS.SocketAdapter = DS.RESTAdapter.extend(DS.SocketAdapterMixin, { init: function() { this._super(); console.log(''SocketAdapter''); } }); App.ApplicationAdapter = DS.SocketAdapter.extend({}); // Use the adapter in the store App.Store = DS.Store.extend({ revision: 13, adapter: DS.SocketAdapter.create({}) });

y mi index.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="en"> <head> <title>Ember.js Example Application</title> <script src="js/libs/jquery-1.10.2.js"></script> <script src="js/libs/handlebars-1.1.2.js"></script> <script src="js/libs/ember-1.5.1.js"></script> <script src="js/libs/Ember_Data.js"></script> <script src="js/app.js"></script> <script src="js/router.js"></script> <!-- <script src="js/models/model.js"></script> --> </head> <body> <h1>Bonjour </h1> <script type="text/x-handlebars"> Hello, {{firstName}} {{lastName}}<br/> <nav> {{#link-to ''post''}}Post{{/link-to}} </nav> <div> {{outlet}} </div> </script> <script type="text/x-handlebars" data-template-name="index"> <h2>My Wrappers</h2> <ul> {{#each post in model}} <li>{{post.number}}</li> {{/each}} </ul> </script></p> <script type="text/x-handlebars" data-template-name="post"> <h2>My Post</h2> <ul> <li> Zied</li> <li> Farah</li> </ul> </script> <script type="text/javascript"> </script> </head> <body> </body> </html>

Sugiero que el problema está en this.get (''store''), se imprime indefinido cuando intento imprimir su valor.


No define la tienda en Ember Data desde Ember Data 1.0 beta 1+.

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

Solo usar esto será suficiente:

App.ApplicationAdapter = DS.SocketAdapter;

La tienda se transfiere a las funciones de find , si lo desea, puede usarla en ese momento. Además, estarás fuera del alcance dentro de un onmessage , pero eso no onmessage al caso.

Recomendación

Como su programa es doble, recomiendo crear sus adaptadores / capa de transporte mediante la inyección de dependencia. Aquí hay un borrador

Transporte

DS.SocketTransport = Ember.Object.extend({ uri: ''ws://localhost:8081/'', type: ''post'', ws: null, store: null, init: function(){ var uri = this.get(''uri''), type = this.get(''type''), store = this.get(''store''), ws = new WebSocket(uri); // callbacks ws.onopen = function() { console.log(''Connection established /all''); }; ws.onclone = function() { console.log(''Connection closed /'' + ''all''); }; ws.onmessage = function(data) { // if this is random post data, side load store.load(''post'', data) console.log(data); }; this._super(); } });

Adaptador de enchufe web

App.MyWsAdapter = DS.RESTAdapter.extend({ transport: null, find: function(store, type, id) { var transport = this.get(''transport''); // Do your thing here return new Ember.RSVP.Promise(function(resolve, reject){ // use the transport here to send a message/get a message, containing // the json for the type and id mentioned above then use //resolve(json); }); }, });

Inyección de dependencia

App.initializer({ name: "transport", after:[''store''], initialize: function (container, application) { var store = container.lookup(''store:main''), postTransport = application.PostTransport.create({store:store, type:''post''}); register("my:postTranspot", postTransport); application.PostAdapter = App.MyWsAdapter.create({ transport: postTransport }); } });