Socket.IO z Ember I Ember-Data
Poszperałem i nie mogę znaleźć żadnych aktualnych przykładów ember (1.0.0-RC.1) I ember-data (Wersja 11), które również wykorzystują socket.io próbowałem czegoś takiego.
App.ApplicationRoute = Ember.Route.extend({
setupController: function(controller, data) {
var socket = io.connect(),
self = this;
socket.on('apartment/new', function(apartment) {
var apt = App.Apartment.createRecord(apartment);
self.controllerFor('apartments').pushObject(apt);
});
}
});
To faktycznie utworzy nową klasę modelu, popycha obiekt do kontrolera i tworzy nowe li, ale wartości nie są renderowane.
<ul class="list-view">
{{#each apartment in controller}}
<li>
{{#linkTo 'apartment' apartment }}
<span class="date">{{date apartment.date}}</span>
{{apartment.title}}
{{/linkTo}}
</li>
{{/each}}
</ul>
Czy to ma coś wspólnego z pętlą run? Jak wymusić renderowanie wartości? A może jest do tego lepsze podejście?
2 answers
Istnieje bardzo proste rozwiązanie, które używam w niektórych moich aplikacjach. Możesz albo mieć wywołanie zwrotne ogólnego przeznaczenia dla gniazda i akceptować dowolny rodzaj danych
callback: function(message) {
// this is better than just `eval`
var type = Ember.get(Ember.lookup, message.type);
store.load(type, message.data);
}
Lub tutaj jest specjalnie dostosowany do twojego przypadku użycia
socket.on('apartment/new', function(apartment) {
store.load(App.Apartment, apartment);
});
Użycie store.load
spowoduje załadowanie danych rekordu bezpośrednio do mapy tożsamości. Istnieje również loadMany
do ładowania wielu rekordów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-16 09:32:52
Ember CLI, gniazda ember i coffescript
Pracuję z Emberem od około miesiąca, więc nie obiecuję, że to najlepszy sposób, ale musiałem skonfigurować projekt Ember CLI z Socket.io I Ember Data. Poniższy kod jest oparty na moim kodzie roboczym, choć poniższy nie jest testowany. Myślę, że wszystko, czego potrzebujesz, aby uzyskać 99% drogi jest tutaj. Powodzenia w rozwiązywaniu problemów!
.jshintrc-Ember service będzie krzycz na Ciebie, jeśli nie umieścisz EmberSockets tutaj
{
"predef": {
"document": true,
"window": true,
"nameofprojectENV": true,
"EmberSockets": true
},
...
}
Brocfile.js-Import gniazd Ember
var EmberApp = require('ember-cli/lib/broccoli/ember-app');
var app = new EmberApp();
// change this path to where ember-sockets.js is
app.import('vendor/ember-sockets/package/ember-sockets.js');
module.exports = app.toTree();
App.js-remember to replace nameofproject with actual project name
import Ember from 'ember';
import Resolver from 'ember/resolver';
import loadInitializers from 'ember/load-initializers';
Ember.MODEL_FACTORY_INJECTIONS = true;
// every controller using ember sockets must be listed here in the controllers array
var Socket = EmberSockets.extend({
host: 'example.local',
port: 8080,
controllers: [
'example'
// more controllers here
]
});
var App = Ember.Application.extend({
modulePrefix: 'nameofproject',
Resolver: Resolver,
Socket: Socket
});
loadInitializers(App, 'nameofproject');
export default App;
Router.coffee-pamiętaj, aby zastąpić nameofproject rzeczywistą nazwą projektu
`import Ember from 'ember'`
Router = Ember.Router.extend
location: nameofprojectENV.locationType
Router.map ->
@route 'example'
`export default Router`
Modele / przykład.kawa
`import DS from 'ember-data'`
Example = DS.Model.extend
name: DS.attr('string')
`export default Example`
Trasy / przykład.kawa
`import Ember from 'ember'`
ExampleRoute = Ember.Route.extend
# set model to be all example records
model: ->
@store.all('example')
setupController: (controller, model) ->
controller.set('model', model)
`export default ExampleRoute`
Kontrolery / przykład.kawa
`import Ember from 'ember'`
ExampleController = Ember.Controller.extend
#### properties
examples: (->
# @get('content') gets the model, which in this case, is example (set in route)
@get('content')
).property('content') # watching the model like this might not be right?
#### methods
getExamples: ->
@socket.emit 'pub',
# whatever data you need to pass to the server
data : {examples: true}
# name of the event you want the data returned on
event: "getExamples"
#### sockets
sockets:
# returns examples from server
getExamples: (data) ->
# log the data for fun, also to see that you are getting data back
console.log data
# set controller to @, which is the same as this.
controller = @
# get your array of examples from JSON returned from server
examples = data.examples
examples.forEach (example) ->
# controller instead of @, or it doesn't work
controller.store.push 'example',
# you need ids or this will not work
id: example.id
name: example.name
`export default ExampleController`
Szablony / przykład.kawa
{{#each example in examples}}
{{example.id}} {{example.name}}
{{/each}}
<button {{action getExamples}}>Get Examples</button>
Proponuję Chrome Ember Inspector do rozwiązywania problemów. Możesz również zobaczyć swoje modele danych i rekordy, między innymi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-02 00:28:28