0

我的 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 中。

但是,当我这样做时,我的 Pages 模板中的所有内容都会消失。

我的{{outlet}}应用程序模板中有一个,站点模板中有另一个,它最终显示页面模板。是的,很复杂,我知道并且可能有更好的方法来做到这一点,所以任何建议都将不胜感激。哦,顺便说一句,我是一个真正的 Ember.js 新手,所以需要明确说明示例。(用蜡笔画出漂亮的颜色实际上是理想的。)

提前感谢您的帮助。

这是刷新问题。在根资源site中,我正在加载一个Site模型,Rails 后端使用发送的 url 返回该模型。最终,这个应用程序将与多个域一起使用,并且每个域都将为其自己的网站提供服务(大致基于 WP-多站点概念)。然后在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');
}

当我尝试这个时,Ember 相当有帮助地让我知道我需要添加needs,但是当我这样做时,我的 Pages 模板是空白的。

哦,是的,我什至尝试target在调用deletePage操作的按钮上设置属性。

我意识到我需要做的是以某种方式访问​​我的Site模型PagesController,但我应该如何去做。

这篇文章具有史诗般的比例。对于那个很抱歉。再次感谢任何帮助。

4

2 回答 2

0

好吧,我想通了。为了后代的缘故(以及其他寻找这个的人)。以下是如何删除模型中具有 belongsTo 关联的对象。

应用控制器:

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 方法的文档很少,基本上必须自己拼凑起来。也许有更好的方法,这可以重构。请在评论中告诉我。

于 2014-03-11T02:38:01.923 回答
0

needs 在路由上不做任何事情,如果你想从路由访问控制器,你可以使用this.controllerFor('application')

此外,当在控制器定义中使用需求时,它应该是这样的needs: 'application'needs: ['foo', 'application']......

于 2014-03-09T04:41:58.687 回答