Добавление потребностей: ['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']...

Другие вопросы по тегам