2013-07-18 2 views
0

В Ember.js, если у вас есть модель, которая имеет отношения «один ко многим», возможно ли генерировать ссылки на основе свойства родительской модели?Ember.js: как использовать свойство родительской модели в URL-адресе?

К примеру, у меня есть модель и некоторые данные, как это:

var SuggestionGroup = Ember.Model.extend({ 
    id: Ember.attr('number'), 
    name: Ember.attr('string'), 
    suggestions: Ember.hasMany('App.Suggestion', { 
     key: 'suggestions', 
     embedded: true 
    }) 
}); 

SuggestionGroup.adapter = Ember.FixtureAdapter.create(); 

SuggestionGroup.FIXTURES = [ 
{ 
    id: 1, 
    name: 'Start', 
    suggestions: [ 
     { 
      id: 1, 
      title: 'Fetching coffee and cake for the Interface Developers', 
      description: 'Because they\'re so brilliant', 
      upVotes: 10, 
      downVotes: 2 
     }, 
     { 
      id: 2, 
      title: 'Criticising the app devs more', 
      description: 'They enjoy a bit of banter', 
      upVotes: 8, 
      downVotes: 4 
     }, 
     { 
      id: 3, 
      title: 'Not updating JIRA', 
      description: 'It\'ll be funny when the PMs start raging', 
      upVotes: 1000000, 
      downVotes: 0 
     } 
    ] 
}] 

А вот мои маршруты:

App.Router.map(function() { 
    this.resource('current-suggestions'); 
    this.resource('suggestion', { 
     path: '/current-suggestions/:suggestion_id' 
    }); 
}); 

Мой шаблон выглядит так:

{{#each model}} 
<td> 
    <ul> 
    {{#each suggestions}} 
     <li class="suggestion"> 
      <h3> 
       {{#linkTo 'suggestion' this}}{{title}}{{/linkTo}} 
      </h3> 
     </li> 
    {{/each}} 
    </ul> 
</td> 
{{/each}} 

Итак, на данный момент моими путями являются current-suggestions/1. Но то, что я хотел бы сделать, это такие пути, как current-suggestions/Start/1. Таким образом, путь генерируется с использованием свойства родительской модели.

Можно ли сделать что-то подобное?

+1

Почему бы не поместить отношения 'ownTo' в child? Затем вы можете получить ссылку на родителя с помощью get(), а затем получить любые свойства, которые вы хотите. – GJK

+0

@GJK Это не доступ к свойствам родителя, с которыми у меня возникают проблемы. Я хочу использовать свойство 'name' для родителя, чтобы создать путь для каждого« Предложения ». Поэтому, если у родителя 'Предложения 'есть' имя'' Старта ', тогда путь будет 'current-ideas/Start/1' или если это' Stop ', то' current-ideas/Stop/1'. –

+0

Ах, я вижу. Я предполагаю, что способ сделать это будет использовать динамический сегмент, но я недостаточно хорош для Ember.js, но не знаю, как это сделать. – GJK

ответ

1

Последний комментарий от @GJK указывал уже в правильном направлении, но позвольте мне предложить несколько сложный ответ на ваш вопрос.

Одним из способов вы можете сделать это, чтобы вклиниться в serialize функции вашего SuggestionRoute и обеспечить отсутствующий динамический сегмент окончательный URL должен иметь, концептуально это будет выглядеть так:

Добавьте дополнительный динамический сегмент к вашему определение маршрута, в вашем случае :name

App.Router.map(function() { 
    this.resource('current-suggestions'); 
    this.resource('suggestion', { 
    path: '/current-suggestions/:name/:suggestion_id' 
}); 
}); 

А затем предоставить данные для динамического сегмента, как это:

App.SuggestionRoute = Ember.Route.extend({ 
    ... 
    serialize: function(model) { 
    var id = model.get('id'); 
    var name = model.get('name'); 
    return { 
     name: name, suggestion_id: id 
    } 
    } 
}); 

Примечание: Данное решение предполагает, что вы предоставили свойство name из вашей родительской модели для модели Suggestion, для этого вы можете пересмотреть свои отношения модели.

И чтобы вдохновить вас о том, как вы могли бы реорганизовать ваше приложение, чтобы достичь своей цели (имеющей URLа, как /current-suggestions/Start/1 и т.д.) имеет вид здесь:

Demo

Я пытался имитировать но с другим подходом.

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

+0

Большое спасибо, это то, что я ищу. Что-то странное происходит с тем, как путь генерируется изначально. Вы заметите, что 'href' якоря содержит« null », где должно быть имя группы. Однако, когда вы нажимаете на ссылку, url имеет имя вместо «null».И тогда, если вы вернетесь к списку предложений, у '' href' якорей больше нет 'null'. Вы знаете, почему это может произойти? –

+1

Проблема в том, что когда модель сначала отправляется методу 'serialize', она не была загружена. Вот почему ни одна из свойств модели не определена (это кажется ошибкой для меня). Мне удалось обойти это, слушая, когда были загружены модели, а затем инициировал повторную визуализацию шаблона. –

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