2013-11-01 4 views
5

У меня есть ресурс, где я перечисляю все свои проекты с сервера/проектов. Вы можете посетить конкретный проект, идущий в/projects /: slug.Ember добавляет пустую строку в данные с slug как id

Когда я посещаю проекты ресурсов я вижу эти данные в Ember Inspector:

/проекты

id | Slug    | Title     | 
------------------------------------------------- 
1 | first-project  | First project   | 
------------------------------------------------- 
2 | second-project | Second project  | 
------------------------------------------------- 
3 | third-project  | Third project   | 

Когда я посещаю проект из списка проектов, я получаю те же данные без нового запроса Ajax и все работает нормально. /проекты/первый-проект

Проблема возникает, когда я обновить /проектов/первый-проект страницы. Ember делает запрос ajax для получения данных с сервера, но также вставляет пустую строку с slug как идентификатор для данных.

id    | Slug    | Title     | 
------------------------------------------------------------- 
first-project |     |      | 
------------------------------------------------------------- 
1    | first-project  | First project   | 

Теперь посещение списка проектов. Он отображает список проектов, но в верхней части списка находится эта пустая строка. Почему он вставляет эту строку в мои строки? Может быть, моя логика ошибочна.

<li> 
    <a id="ember451" class="ember-view" href="/projects/undefined"> 
     <script id="metamorph-13-start" type="text/x-placeholder"></script> 
     <script id="metamorph-13-end" type="text/x-placeholder"></script> 
    </a> 
</li> 

Мой код для проектов:

App.Router.map(function() { 
    this.resource('project', { path: '/projects' }, function() { 
     this.resource('project.show', { path: ":post_slug"}); 
    }); 
}); 

App.Project = DS.Model.extend({ 
    slug: DS.attr("string"), 
    title: DS.attr("string") 
}); 

App.ProjectIndexRoute = Ember.Route.extend({ 
    model: function() { 
     return this.store.find('project').then(function(data) { 
      return data; 
     }); 
    } 
}); 

App.ProjectShowRoute = Ember.Route.extend({ 
    model: function(params) { 
     return this.store.find('project', params.post_slug).then(function(data) { 
      return data; 
     }); 
    }, 
    serialize: function(model) { 
     return { post_slug: model.get("slug") }; 
    } 
}); 

Я использую:

DEBUG: ------------------------------- 
DEBUG: Ember  : 1.1.2 
DEBUG: Ember Data : 1.0.0-beta.3 
DEBUG: Handlebars : 1.0.0 
DEBUG: jQuery  : 1.9.1 
DEBUG: ------------------------------- 

ответ

2

добавления это помогает в настоящее время первичного ключа тихоход для модели проекта и не повторяющиеся строк

App.ProjectSerializer = DS.RESTSerializer.extend({ 
    normalize: function(type, hash, property) { 
     hash.id = hash.slug; 
     return this._super(type, hash, property); 
    } 
}); 
0

Позвонив

store.find('project', 'first-project') 

вы лечения слизняка в качестве первичного ключа , Я предполагаю, что это причина, по которой инициализируется новая запись (у вас есть один с фактическим первичным ключом первого проекта, который, вероятно, является числом, и один с «первым проектом» в качестве первичного ключа. Попробуйте изменить привязку модели на вызов находки магазина() метод с хэш параметров поиска, в вашем случае:..

store.find('project', { slug: 'first-project' }) 
+0

Это делает запрос/проекты ajax? Slug = first-project. Когда я изменяю его на {slug: params.slug} для динамического, запрос есть/projects, а часть slug включена. Кстати, мне нужен запрос, чтобы выглядеть так/projects/firs-project not/projects? Slug = first-project. Благодаря! –

0

Существует два способа решения этой проблемы без расширения RESTSerializer.

Первый способ: Если вы можете убедиться, что slug str уникален для всего приложения, и вам действительно не нужны номера идентификаторов. Затем вы можете установить идентификаторы для каждого проекта, используя slug str, потому что идентификаторы не должны быть цифрами.

{ID: 'первый-проект', содержание: 'ххх'} { ID: 'второго проекта', содержание: 'YYY'}

Второй метод. используйте метод modelFor.пример кода ниже:

App.ProjectShowRoute = Ember.Route.extend({ 
    model: function(params) { 
     return this.modelFor('its_parent_route').findBy('slug', params.post_slug); 
    }, 
    serialize: function(model) { 
     return { post_slug: model.get("slug") }; 
    } 
}); 

Позвонив modelFor здесь, он не будет делать дубликаты вызовов на сервер, так как вы используете данные Ember.

Надеюсь, это поможет.

Смежные вопросы