2015-08-29 2 views
0

У меня есть левый список деревьев, и каждый элемент в списке открывает тот же маршрут с другой моделью. Я хочу, если я снова и снова нажимаю на один и тот же элемент, я хочу, чтобы маршрут снова загружался. Я знаю, что ember обычно не работает таким образом. Есть ли какие-либо хитрости для достижения этого?Ember - Переход на тот же маршрут с той же моделью

Обновление: Левое дерево - это родительский маршрут. При нажатии элементов в левом дереве в его розетке загружается дочерний маршрут.

Мое левое дерево будет структурировано как это,

item1(link to bodyRoute1 with model1) item2(link to bodyRoute1 with model2) item3(link to bodyRoute1 with model3) item4(link to bodyRoute2 with model1) ...etc

ответ

0

Я получил это работает, делая так,

Я поддерживать currentRouteName и currentModelId (идентификатор, чтобы однозначно идентифицировать модель) в объекте, и он вводится во всех маршрутах. Он обновляется при любом переходе.

Все переходы из левого дерева проходят через общую функцию. И в этой функции я проверяю, соответствует ли маршрут пересылки modelId текущему маршруту, modelId. Если это так, я изменяю значение другого объекта, введенного в глобальном масштабе refreshSameRoute. Это значение наблюдается в дочерних маршрутах, и если оно меняет this.refresh().

Ищет лучший метод.

0

Вы можете использовать refresh() метод маршрута api link, например:

// route 
actions: { 
    refreshRoute: function() { 
    this.refresh(); 
    } 
} 

//template 
<ul> 
    {{#each items as |item|}} 
    <li {{action 'refreshRoute'}}>{{item}}</li> 
    {{/each}} 
</ul> 

Update

One свойства контроллера необходимо обновить с сервера

Таким образом, вы можете использовать крючок модели afterModel.

От guides:

Наиболее распространенной причиной этого является то, что если вы переходите в маршрут с динамическим сегментом URL с помощью {{ссылка к}} или transitionTo (в отличие от перехода, вызванного изменение URL-адреса), модель для маршрута, в который вы переходите, уже была указана (например, {{# link-to 'article' article}} или this.transitionTo («статья», статья)), и в этом случае крючок модели не будет называться. В этих случаях вам нужно использовать либо beforeModel, либо afterModel hook для размещения любой логики, пока маршрутизатор все еще собирает все модели маршрута для выполнения перехода.

+0

Левое дерево - это родительский маршрут. Обновлен вопрос. – AcidBurn

+0

Могу ли я спросить, что вы определенно подразумеваете под «маршрутом для загрузки снова» с той же моделью? Вы хотите, чтобы модель была обновлена ​​с сервера или, возможно, вы хотите что-то сделать в режиме крючка модели?Обычно такое поведение может быть достигнуто путем изменения типов «model», «beforeModel», «afterModel» и «setupController». Но это зависит от того, что вы хотите точно. – artych

+0

Да, одно из свойств контроллера необходимо обновить с сервера. – AcidBurn

0

Методы переходов, такие как transitionToRoute и replaceRoute, возвращают некоторые параметры, включая targetName. Когда параметры запроса совпадают, targetName возвращает undefined. Вы можете проверить это и обновить маршрут.

const queryParams = {<your params>}; 
const routeName = 'my.route'; 
const transition = this.transitionToRoute(routeName, { queryParams }); 
if (transition.targetName !== routeName) { 
    const route = getOwner(this).lookup(`route:${routeName}`); 
    route.refresh(); 
} 
Смежные вопросы