2016-02-03 1 views
5

Я следую за документами для Ember 2.3 и не могу найти нигде что-то очень простое: как получить доступ к значению, предоставленному крючком модели маршрута внутри основного шаблона: application.hbs?Как получить доступ к данным из маршрутов в шаблоне приложения Ember?

маршрутов/client.js

// ... 
export default Ember.Route.extend({ 
    model() { 
     return { 
      navigation: [ 
       { 
        title: "Projects", 
        link: "projects" 
       }, 
       { 
        title: "My Specifications", 
        link: "specs" 
       } 
      ] 
     } 
    } 
}); 

шаблонов/application.hbs

<nav> 
    {{#each navigation as |navItem|}} 
     <li>{{#link-to navItem.link}} {{navItem.title}} {{/link-to}}</li> 
    {{/each}} 
</nav> 
{{outlet}} 

Как теперь, объект навигации доступен шаблону маршрута (client.hbs), но не к шаблону приложения.

+1

Прежде всего, вы должны указать моделирование данных с помощью {{#each model.navigation ...}} в шаблоне. Во-вторых, каждый маршрут соответствует его шаблону. В вашем случае вам нужен маршрут приложения для отображения данных из модели в приложении hbs. –

+0

Это именно то, чего меня не интересует, @kristjan. У меня есть (очень распространенная) ситуация, когда мне нужен обычный маршрут для предоставления данных, которые должны быть доступны внутри родительского шаблона (application.hbs). Например, список активной навигации. – Slavic

+0

@Slavic Каждый шаблон, имеющий свой собственный маршрут, является обычным способом. Консолидация конфигурации, но если вы хотите отобразить навигационную модель в своем маршруте приложения, почему бы не возвратить несколько моделей для вашего маршрута приложения? – Craicerjack

ответ

3

Вот как это делается (если уголек не придумывает лучшим образом в будущих версиях):

маршруты/client.js

// ... 
export default Ember.Route.extend({ 
    setupController() { 
     this.controllerFor('application').set('navigation', ["nav1", "nav2"]); 
    } 
}); 

Спасибо, Иван, за ответ!

+0

В фокусе не было подходящего места для контроллера. Для метода, но, да, я согласен, что это не лучшее место. – Slavic

2

Как один доступ значение обеспечивается модель крючок маршрута внутри основного шаблона

По умолчанию внутри setupController крюка маршрута, Эмбер будет set the property model on your controller к разрешенной стоимости обещания возвращается от крюка маршрута model.

Значение вы можете просто использовать свойство model в шаблоне для доступа model.navigation:

<nav> 
    {{#each model.navigation as |navItem|}} 
     <li>{{#link-to navItem.link}} {{navItem.title}} {{/link-to}}</li> 
    {{/each}} 
</nav> 

Если вы хотите использовать другое имя, вы можете переопределить setupController крюк и установить имя себя:

export default Ember.Route.extend({ 
    // ... 
    setupController(controller, model) { 
    this.set('navigation', Ember.get(model, 'navigation')); 
    } 
    // ... rest of the code 
}) 

Значит, вы можете использовать navigation вместо model.navigation внутри шаблона. Другой способ мог бы добавить alias внутри контроллера для model собственности:

export default Ember.Controller.extend({ 
    navigation: Ember.computed.alias('model.navigation') 
    // ... rest of the code 
}) 

, который позволит вам, а также использовать navigation вместо model.navigation.

Однако, если вы хотите иметь какую-то глобальную навигацию в своем приложении, лучшим способом было бы использовать Service, который вы вводите в любой контроллер, который нуждается в навигации. Что-то вроде:

// app/services/navigation.js 
export default Ember.Service.extend({ 
    items: null, 

    init() { 
    this._super(...arguments); 
    this.set('items', [{ 
     title: "Projects", 
     link: "projects" 
    }, { 
     title: "My Specifications", 
     link: "specs" 
    }]); 
    } 
}); 

А затем вводят его в контроллерах:

export default Ember.Controller.extend({ 
    navigation: Ember.service.inject() 
}); 

И теперь у вас есть доступ к навигации в шаблоне этого контроллера, а также.

+0

. Меня не интересовало обращение к данным с использованием другого имени. Мне model.navigation вполне нормально. Задача состояла в том, чтобы просто получить эти данные. – Slavic

+0

@ Славский, я вижу, как я пропустил тебя, я исправил свой ответ. Я также добавил предложение о том, как при необходимости использовать глобальную навигацию. – nem035

+0

К сожалению, служба, похоже, не затрагивает проблему. Это связано с тем, что каждый контроллер будет говорить о навигации (например, чтобы отметить элемент навигации как активный, но не только этот). Сейчас я склоняюсь к решению setupController, и, хотя я еще не знаю, разрешит ли он все мои проблемы с навигацией, это, безусловно, решение того, что было задано, в частности. У тебя есть моя возвышенность. – Slavic

0

Я бы разрешил эту проблему следующим образом. Создайте компонент навигации, который принимает пользовательские параметры.

Шаблоны application.hbs

теперь в вашем client.js

apiURL: 'navigations/client' 

и пользовательский компонент таможенно-navigation.js

resolvedRouteNavs: function() { 
    return DS.PromiseArray.create({ 
      promise: store.query(this.get('url'), { user? : userID?? }); 
    }) 
}.property('apiURL') 

И custom-navigation.hbs.

{{#each resolvedRouteNavs as |navItem|}} 
    {{navItem.name}} 
{{/each}} 

Если вы имеете дело со статическими массивами, как навигации

то нет разрешения не требуется, и были бы просто отказ поставить переплетен массив, который отличается для каждого маршрута.

client.js

navs: [{ name: '1', route: 'foo'}, { name: '2', route: 'bar' }] 

некоторые-разные-place.js

navs: [{ name: 'blah', route: 'foo.bar'}, { name: 'meh', route: 'bar.foo' }] 

И действительно модель крючок должен содержать данные, извлекаемые с сервера. В противном случае используйте hookController.

setupController: function(controller, model) { 
     this._super(controller, model); 

     controller.setProperties({ 
      nav: [] 
     }); 
Смежные вопросы