2013-06-20 3 views
4

Я следующий маршрут определяется:Переход на другой маршрут, когда верхний ресурс доступен, но не тогда, когда вложенная маршрут доступен

SettingsApp.Router.map(function() { 
    .... 
    this.resource('profile', function() { 
     this.route('user'), 
     this.route('company') 
    }); 

}); 

SettingsApp.ProfileRoute = Ember.Route.extend({ 
    redirect: function() { 
     this.transitionTo('profile.user'); 
    }, 
    model: function() { 
     return Ember.A([ 
      Ember.Object.create({title:"User", link:"#/profile/user"}), 
      Ember.Object.create({title:"Company", link:"#/profile/company"}) 
     ]); 
    } 
}) 

#/profile перенаправляет #/profile/user, как и ожидалось, но проблема что #/profile/company делает также redirect to #/profile/user. Кажется, перенаправление ресурсов выполняется каждый раз, когда я обращаюсь к любому URL-адресу ниже этого ресурса.

Почему это? Как я могу перенаправить только высший уровень #/profile?

ответ

3

Вы можете переместить redirect() на index маршрута profile reource в, ProfileIndexRoute, который заставит его срабатывать только при просмотре в #/profile и позволяет получить доступ к #/profile/user и #/profile/company без проблем:

SettingsApp.Router.map(function() { 
    this.resource('profile', function() { 
     this.route('user'); 
     this.route('company'); 
    }); 

}); 

SettingsApp.ProfileRoute = Ember.Route.extend({ 
    //redirect: function() { 
    // this.transitionTo('profile.user'); 
    //}, 
    model: function() { 
     return Ember.A([ 
      Ember.Object.create({title:"User", link:"#/profile/user"}), 
      Ember.Object.create({title:"Company", link:"#/profile/company"}) 
     ]); 
    } 
}); 


SettingsApp.ProfileIndexRoute = Ember.Route.extend({ 
    redirect: function() { 
     this.transitionTo('profile.user'); 
    }, 
}); 

Example JSBin

Подсказка: установите LOG_TRANSITIONS: true на свой Application, чтобы показать вам, к каким маршрутам осуществляется доступ через маршрутизатор. Это очень полезно для отладки таких проблем.

SettingsApp = Ember.Application.create({ 
    LOG_TRANSITIONS: true 
}); 
+0

Спасибо, это то, что я искал! – dangonfast

+0

Но один вопрос: какая разница между «ProfileIndexRoute» и «ProfileRoute». Вы упомянули, что 'ProfileIndexRoute' запускается при доступе' #/profile'. Когда срабатывает «ProfileRoute»? Когда у меня не было 'ProfileIndexRoute', оно было запущено на' #/profile' тоже. – dangonfast

+1

@ gonvaled относительно вопроса о различии между 'PostsRoute' и' PostsIndexRoute' см. Здесь: http: //emberjs.com/guides/routing/defining-your-routes/. И последний намек, если вы жестко привязываете свои ссылки к маршрутам, имейте в виду, что если ваши изменения структуры маршрута, вы должны найти все вхождения ваших ссылок и переписать их тоже – intuitivepixel

1

redirect в вашем ProfileRoute является жесткой переадресацией, это означает, что независимо от того, какие вложенные маршруты/ресурсы у вас есть, он всегда будет перенаправлен на profile.user. Чтобы иметь другое поведение, вы должны удалить крюк redirect и предоставить ссылки с родительского шаблона или навигация к вашим под-ресурсам, например.

{{#linkTo profile.user}}User{{/linkTo}} 
{{#linkTo profile.company}}Company{{/linkTo}} 

Это создаст следующий HTML-код:

<a href="/user">User</a> 
<a href="/company">Company</a> 

И в случае, если вы хотите передать модель в переходе маршрута вы могли в ваши настройки шаблона вещи, как:

{{#linkTo profile.user user}}User{{/linkTo}} 
{{#linkTo profile.company company}}Company{{/linkTo}} 

В случае, если вы передаете модель, вам необходимо соответствующим образом изменить карту маршрутизатора:

SettingsApp.Router.map(function() { 
    .... 
    this.resource('profile', function() { 
    this.route('user', { path: "/user/:user_id" }), 
    this.route('company', { path: "/company/:company_id" }) 
    }); 
}); 

Это создаст следующий HTML-код:

<a href="/profile/user/1">User</a> 
<a href="/profile/company/1">Company</a> 

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

Надеюсь, это поможет.

+0

Это работает, но я должен вручную кодировать меню, которое ранее было сделано с помощником '{{вид Bootstrap.Tabs}}', и я хотел бы сохранить это. – dangonfast

Смежные вопросы