Эмбер без данных Ember
Данные Ember по-прежнему не соответствуют версии 1.0, и поэтому я решил использовать Ember без моделей данных.
У меня есть свои собственные модели, и они создаются функцией маршрутной модели.
Однако сохранение состояния между объектами frontend и объектами backend является кошмаром.
Особенно, когда один маршрут использует другие модели маршрутов.
- Как это может быть достигнуто, следует ли написать собственный метод поиска на складе и модели?
- Должен ли я использовать данные Ember (хотя это не в версии 1.0?), возможно, ETA на Ember Data 1.0?
- написать код для обновления моделей на интерфейсе каждый раз, когда я меняю модель?
- Другой метод?
Я делаю лучшие практики, или я должен делать это по-другому?
Я чувствую, что без использования Ember Data я должен написать свой собственный магазин. Мне бы очень хотелось получить отзывы от некоторых из вас, ребята.
Пример модели:
App.Person = Ember.Object.extend(App.Serializable,Em.Copyable,{
user_email : null //used in routing dynamic segements and as old email when making changes to email
,first_name: null
, last_name: null
, fullname : function () {
return this.first_name + ' ' + this.last_name;
}.property('first_name','last_name').cacheable()
};
App.Person.reopenClass({
createRecord: function(data) {
return App.Person.create({
user_email : data.email
, first_name: data.first_name
, last_name : data.last_name
}});
Пример того, как я загружаю модели класса:
App.UsersRoute = App.AuthenticatedRoute.extend( {
model : function () {
return new Ember.RSVP.Promise(function(resolve, reject) {
$.getJSON('/users').then(function(usersData) {
var userObjects = [];
usersData.forEach(function (data) {
userObjects.pushObject(App.Person.createRecord(data));
});
resolve( userObjects);
},function(error) {
reject(error);
});
})
},
Подпрограммы используют модель:
App.UsersAvailableRoute = App.AuthenticatedRoute.extend( {
model : function () {
return {
allUsers : Ember.ArrayController.create({
content : this.modelFor('users').filter( function (user) {
return user.availablity === 100
}),
Пример того, как я обновляю модель в контроллере:
App.UsersAvailableController = Ember.ArrayController.extend({
needs : ['users']
,applyPersonAssign : function (person,need,project) {
need.set('allocated',person);
var updateObject = Ember.copy(project,true);
if (Ember.isEmpty(need.get('inProject'))) {
updateObject.projectNeeds.pushObject(need);
}
return $.ajax({
url: '/projects/' + updateObject.get('codename'),
"type": "PUT",
"dataType": "json",
data: updateObject.serialize()
})
Ответы
Ответ 1
Вам не обязательно восстанавливать хранилище Ember Data. Ember отлично работает с POJO, вы также можете обернуть ваши POJO в объект Ember, чтобы дать вам некоторые интересные встроенные функции.
Как утверждается, создание пользовательского адаптера, который кэширует результаты, может быть удобным.
Вот пример, когда я создаю адаптер, поддерживающий кеширование. Вы можете постепенно использовать концепцию для всех основных вещей, которые вам нужны.
App.FooAdapter = Ember.Object.extend({
cache:{},
find: function(id){
var self = this,
record;
if(record = this.cache[id]){
return Ember.RSVP.cast(record);
}
else
{
return new Ember.RSVP.Promise(function(resolve){
resolve($.getJSON('http://www.foolandia.com/foooo/' + id));
}).then(function(result){
record = self.cache[id] = App.Foo.create(result);
return record;
});
}
}
});
В приведенных ниже примерах я использую контейнер для регистрации адаптера на всех моих маршрутах/контроллерах, поэтому у меня был ленивый легкий доступ к нему.
http://emberjs.jsbin.com/OxIDiVU/742/edit
Если вы всегда хотите, чтобы это было обещание:
http://emberjs.jsbin.com/OxIDiVU/740/edit
Многократное использование
В приведенном выше примере может показаться, что вам нужно будет потратить кучу работы, но не забывайте, что Ember супер многократно используется, воспользовавшись магией.
App.MyRestAdapter = Em.Object.extend({
type: undefined,
find: function(id){
$.getJSON('http://www.foolandia.com/' + this.get('type') + '/' + id
}
});
App.FooAdapter = App.MyRestAdapter.extend({
type: 'foo' // this would create calls to: http://www.foolandia.com/foo/1
});
App.BarAdapter = App.MyRestAdapter.extend({
type: 'bar' // this would create calls to: http://www.foolandia.com/bar/1
});
Это основная идея того, что такое Ember Data/Ember Model. Они пытались создать тонну дефолтов и встроены в прохладу, но иногда это излишне, особенно если вы просто потребляете данные и не делаете CRUD.
Пример: http://emberjs.jsbin.com/OxIDiVU/744/edit
Также вы можете прочитать это (говорит то же самое):
Как создать пользовательский адаптер для ember.js?
Ответ 2
Где я работаю, мы используем Ember Data и Ember CLI, несмотря на то, что они довольно нестабильны. До сих пор Ember Data не вызывала здесь слишком много боли и страданий. Магазин довольно легко понять, и документация на Ember для этой грани структуры довольно хорошая. Единственная проблема, которую я испытываю, связана с динамической сортировкой моделей, и когда я изменяю их содержимое, они меняются в соответствии с изменениями, которые я делаю, а где-то по дороге происходит что-то действительно странное, не уверен, что этот Ember Ошибка данных.
Короче говоря, мы нашли некоторый успех, используя Ember Data, и не можем жаловаться на него, если этот маршрут вы хотите.
Ответ 3
Если вы знакомы с Ruby, Rails - отличное решение для бэкэнд.
Сообщество ember поддерживает рельсы с ember-rails gem, который позволяет использовать рельсы в качестве средства для обслуживания JSON.
Начало работы
-
Добавить жемчужину в ваше приложение Gemfile:
gem 'ember-rails'
gem 'ember-source', '~ > 1.9.0' # или версия, которая вам нужна
-
Выполнить bundle install
-
Затем создайте структуру приложения:
рельсы генерируют ember: bootstrap
-
Перезагрузите сервер (если он запущен)
Построение нового проекта с нуля
Rails поддерживает возможность создания проектов из файла ruby файла шаблона.
Чтобы создать проект Ember centric Rails, вы можете просто ввести следующее в свою командную строку:
rails new my_app -m http://emberjs.com/edge_template.rb
Чтобы установить последние сборки данных ember и ember-data. Следует отметить, что
примеры в руководстве по началу работы
были разработаны для использования выпущенной версии ember:
rails generate ember:install
Затем все, что вам нужно сделать, это рендеринг json в ваших контроллерах, например
class ProjectsController < ApplicationController
def index
respond_to do |format|
format.json { render json: Project.all }
end
end
def show
respond_to do |format|
format.json { render json: Project.where(name: params[:name])}
end
end
end
обязательно обновите сериализаторы
class ProjectSerializer < ApplicationSerializer
attributes :id, :name, :description, :imgUrl, :deployUrl
end
настроить маршруты
EmberRailsBlog.ProjectsRoute = Ember.Route.extend({
model: function(){
return this.store.find('project');
}
});
и, наконец, ваша модель
var attr = DS.attr;
EmberRailsBlog.Project = DS.Model.extend({
name: attr(),
description: attr(),
imgUrl: attr(),
deployUrl: attr()
});