Как визуализировать содержимое двух стручков на одной странице?
Я новичок в ember/ember-cli и медленно осваиваю огромную кривую обучения... Я столкнулся с проблемой, на которую я надеялся, что кто-то может посоветовать мне...
У меня есть приложение, которое отображает контакт, а затем помещает вкладки под сведениями о контакте, одна вкладка содержит некоторые примечания, а другая - информацию о местоположении сайта.
По сути, у меня есть раздел Bootstrap "Tabbed" на моей странице. С (в настоящее время) двумя вкладками с надписями "Сайты" и "Заметки". Идея заключается в том, что если вы нажмете "Заметки", вы увидите контент из модуля "Примечания", а если вы нажмете "Сайты", вы увидите содержимое из модуля "Сайты".
Для этого я называю свои магазины, например,
{{outlet 'sites-tab'}}
а также
{{outlet 'notes-tab'}}
т.е.
{{#em-tabs selected-idx=tab_idx}}
{{#em-tab-list}}
{{#em-tab}}Sites{{/em-tab}}
{{#em-tab}}Notes{{/em-tab}}
{{#em-tab}}...{{/em-tab}}
{{/em-tab-list}}
{{#em-tab-panel}}
{{outlet 'sites-tab'}}
{{/em-tab-panel}}
{{#em-tab-panel}}
{{outlet 'notes-tab'}}
{{/em-tab-panel}}
{{#em-tab-panel}}
<p>Future Use</p>
{{/em-tab-panel}}
{{/em-tabs}}
и используя:
renderTemplate: function() {
this.render({
into: 'contacts.show', // the template to render into
outlet: 'notes-tab' // the name of the outlet in that template
});
}
в двух маршрутах, чтобы разместить контент в нужном месте.
если я использую URL-адреса вручную, например:
contacts/5961168002383609856/sites
contacts/5961168002383609856/notes
Затем содержимое отображается на соответствующей вкладке (а другая пуста).
структура каждого стручка имеет вид:
app/pods/notes/-form/template.hbs
app/pods/notes/edit/controller.js
app/pods/notes/edit/route.js
app/pods/notes/edit/template.hbs
app/pods/notes/index/controller.js
app/pods/notes/index/route.js
app/pods/notes/index/template.hbs
app/pods/notes/new/controller.js
app/pods/notes/new/route.js
app/pods/notes/new/template.hbs
app/pods/notes/show/controller.js
app/pods/notes/show/route.js
app/pods/notes/show/template.hbs
app/pods/notes/base-controller.js
app/pods/notes/route.js
Вы можете подумать о том, что заставило бы ember-cli отображать оба содержимого в каждом выпуске на одной странице?
мой app / router.js содержит:
Router.map(function() {
this.resource("contacts", function() {
this.route("new");
this.route("edit", {path: ':contact_id/edit'});
this.route("show", {path: ':contact_id'}, function(){
this.resource("notes", function() {
this.route('new');
this.route('edit', {path: ':note_id/edit'});
});
this.resource("sites", function() {
this.route('new');
this.route('edit', {path: ':site_id/edit'});
});
});
});
});
большое спасибо с любой помощью вы можете предложить.. спасибо.
РЕДАКТИРОВАТЬ:
Хорошо, согласно предложению @Sam Selikoff, я попытался перейти на компоненты, выполнив:
ember generate component contact-sites
ember generate component contact-notes
создал файлы:
app/components/contact-notes.js
app/components/contact-sites.js
and
app/templates/components/contact-notes.hbs
app/templates/components/contact-sites.hbs
Затем я переместил свой шаблон HTML из pods/notes/index/template.hbs
в app/templates/components/contact-notes.hbs
Это (с некоторыми изменениями), казалось, правильно отображало содержимое. Затем я перешел к редактированию заметки. Для этого у меня есть кнопка с действием: {{action "editNote" note}}
поэтому пришлось перенести мои действия из pods/notes/index/route.js
в app/components/contact-notes.js
например:
приложение / компоненты / контакт-notes.js
import Ember from 'ember';
export default Ember.Component.extend({
actions: {
newnote: function(note) {
console.log("NEW NOTE:", note.contact);
this.transitionTo('notes.new');
return false;
},
editNote: function(note) {
console.log("Edit Note:", this);
this._transitionTo('notes.edit', note);
return false;
}
}
});
но я не могу заставить работать маршрут редактирования заметок. Я либо (используя this._transitionTo('notes.edit', note);
) получаю сообщение об ошибке:
DEPRECATION: Ember.View#transitionTo has been deprecated, it is for internal use only
или если я использую this._transitionTo('notes.edit', note);
Я получаю другую ошибку:
TypeError: currentState is undefined
if (currentState.enter) { currentState.enter(this); }
какие-либо мысли о том, как я могу добраться до маршрута из компонента? - Спасибо.
1 ответ
В общем, вам не нужно звонить render
или используйте названные торговые точки, которые часто. Вместо этого используйте компоненты, что-то вроде
{{#em-tabs selected-idx=tab_idx}}
{{#em-tab-list}}
{{#em-tab}}Sites{{/em-tab}}
{{#em-tab}}Notes{{/em-tab}}
{{/em-tab-list}}
{{#em-tab-panel}}
{{contact-sites site=contact.sites}}
{{/em-tab-panel}}
{{#em-tab-panel}}
{{contact-notes notes=contact.notes}}
{{/em-tab-panel}}
{{/em-tabs}}
Помните, что ваша структура URL связана с тем, как ваш интерфейс отображается, поэтому, если вы хотите, чтобы две вещи отображались одновременно, не связывайте их с двумя разными URL.