Добавление потребностей: ['ApplicationController'] делает мой взгляд исчезающим
Мое приложение Ember.js настроено примерно так:
маршрутизатор:
App.Router.map ->
@resource('site', { path: '/' }, ->
@resource('dashboard')
@resource('account')
@resource('pages', { path: '/:page_slug'}))
Маршруты:
App.ApplicationRoute = Ember.Route.extend
model: ->
return App.Site.find(1)
App.PagesRoute = Ember.Route.extend
model: (params)->
return App.Page.find(params.page_slug)
РЕДАКТИРОВАТЬ:
Контроллер (JS не Кофе):
App.PagesController = Ember.ObjectController.extend({
needs: 'ApplicationController',
...
});
У меня есть ApplicationController и PagesController. Когда я нахожусь на странице, я хочу вызвать действие, чтобы удалить текущую страницу. Если я помещу его в PagesController, он будет работать нормально, но навигационное меню со списком страниц в ApplicationView не будет обновлено, пока я не обновлю страницу. Итак... я предполагаю, что мне нужно поместить действие в ApplicationController и добавить needs: ['ApplicationController']
на мой PagesController.
Однако, когда я делаю это, все в моем шаблоне страниц исчезает.
у меня есть {{outlet}}
в моем шаблоне приложения и еще один в шаблоне сайта, который в конечном итоге отображает шаблон страниц. Да, сложно, я знаю, и, возможно, есть лучший способ сделать это, поэтому любые предложения будут с благодарностью. Да, и кстати, я настоящий новичок в Ember.js, поэтому примеры должны быть четко изложены. (Рисование их красивыми цветами карандашом было бы идеальным вариантом.)
Заранее благодарю за любую помощь.
Вот проблема обновления. В корневом ресурсе site
Я загружаю в одном Site
модель, которую серверная часть Rails возвращает, используя отправляемый URL. В конце концов, это приложение будет использоваться с несколькими доменами, и каждый домен будет обслуживаться своим собственным веб-сайтом (примерно на основе концепции WP-Multisite). Тогда в pages
маршрут, я загружаю одну страницу сайта на основе его slug
приписывать. Это все работает нормально. Итак, теперь я хочу позволить пользователю иметь возможность добавлять и удалять страницы по своему усмотрению.
Итак, проблема заключается в следующем. Когда я удаляю страницу в PagesController
Уровень, страница удаляется просто отлично, но ApplicationController не получает уведомления. А именно, мое навигационное меню:
<ul class="left">
{{#each page in page}}
<li>{{#link-to 'pages' page.slug}}{{page.menu_name}}{{/link-to}}</li>
{{/each}}
<li id="add-page-button"><a data-tooltip title="Click here to add a new page to your site." href="#" data-reveal-id="addPageModal" data-reveal>+</a></li>
</ul>
не получает уведомления о том, что страница отсутствует, и поэтому не обновляет навигационное меню, удаляя эту страницу из списка. Добавление работает нормально, список навигации обновляется при добавлении новой страницы, но я делаю это на ApplicationController
уровень вроде так:
addNewPage: ->
# Get the site
site = @get('model')
# Get all the pages associated with the site
pages = site.get('page')
title = this.get('newTitle')
if (!title.trim())
return
slug = this.get('newSlug')
if (!slug.trim())
return
menu_name = this.get('newMenuName')
if (!menu_name.trim())
return
# Create a new page passing in our title, slug and menu_name
pages.create({title: title, slug: slug, menu_name: menu_name})
# Save the pages
pages.save()
if (pages.isError)
console.log(pages.errors)
else
@set('newTitle', '')
@set('newSlug', '')
@set('newMenuName', '')
$('#addPageModal').foundation('reveal', 'close')
А это мой deletePage
код на PagesController
(извините, у меня есть смесь JS и CoffeeScript):
deletePage: function (slug) {
var page = this.get('model');
this.get('ApplicationController').deletePage(page);
this.toggleProperty('isEditingTitle');
this.toggleProperty('isShowingDeleteConfirmation');
this.transitionToRoute('site.index');
}
Когда я пытаюсь это сделать, Эмбер довольно услужливо сообщает мне, что мне нужно добавить needs
но опять же, когда я это делаю, мой шаблон страниц пуст.
О да, я даже пытался установить target
атрибут на кнопке вызова deletePage
действие.
Я понимаю, что мне нужно как-то получить доступ к Site
модель в моем PagesController
, но как я должен идти об этом.
Этот пост принял эпические пропорции. Извини за это. Еще раз спасибо за любую помощь.
2 ответа
Ладно, все, я понял это. Ради потомков (и тех, кто ищет это). Вот как можно удалить объект в модели, которая имеет ассоциацию ownTo.
ApplicationController:
deletePage: function () {
# First we find the Site which all pages belongTo
# Just ignore the hard-coded '1' it's something I have to do to get it to work
site = App.Site.find(1);
# Then we get the current model, i.e., the 'page' we're on and about to delete
page = this.get('model');
# Then, we get all 'pages'
pages = site.get('page');
# We remove the object from the page which updates the navigation menu
pages.removeObject(page);
# We delete the record and save the 'pages' model
page.deleteRecord();
pages.save();
}
Шаблон страницы:
{{#if isShowingDeleteConfirmation}}
<div class="large-7 large-offset-5">
<label class="inline left">Are you sure? (Can't be undone)</label>
<button {{action 'deletePage'}} class='button tiny alert'>Yes</button>
<button {{action 'cancelDeletePage'}} class='button tiny'>Cancel</button>
</div>
{{else}}
<div class="large-2 right">
<button {{action 'showDeleteConfirmation'}} class='button tiny alert'>Delete Page</button>
</div>
{{/if}}
Я могу показать вам атрибуты и логику, стоящие за оператором if... else, если понадоблюсь.
По сути, пользователь нажимает кнопку "Удалить", показывая другие кнопки "да" и "отмена". После нажатия "да", deletePage
действие называется.
Я нашел очень мало документации по методу deleteRecord и мне пришлось собрать все это вместе. Возможно, есть лучший способ, и это можно изменить. Просто дайте мне знать в комментариях.
Нужно ничего не делать на маршруте, если вы хотите получить доступ к контроллеру по маршруту, который вы можете просто использовать this.controllerFor('application')
Кроме того, при использовании потребностей в определении контроллера это должно быть так needs: 'application'
или же needs: ['foo', 'application']
...