Ember App.Router.router.currentState undefined

Я хочу контролировать App.Router.router.currentState с целью активации / деактивации навигационных ссылок. Что-то в этом роде, как описано здесь: /questions/1339064/marshrutizator-emberjs-10-pre-ne-mozhet-najti-sostoyanie-dlya-puti-i-govorit-chto-marshrutizator-ne-opredelen/1339072#1339072

Однако свойство currentState больше не существует в маршрутизаторе. App.get('Router.router.currentState') возвращает неопределенное значение.

Я полагаю, это изменилось в последних версиях Ember. Есть ли другой способ сделать это?

4 ответа

Решение

Хорошо. Получил это решено. Кажется, что currentPath установлен в экземпляре applicationController. Итак, я сделал это:

App = Em.Application.create({

    currentPath: '',

    ApplicationController : Ember.Controller.extend({
        updateCurrentPath: function() {
            App.set('currentPath', this.get('currentPath'));
        }.observes('currentPath')
    }),

    ...

});

Затем я могу связать или наблюдать App.currentPath из любой точки кода и реагировать на его изменения.

Я полагаю, что "учебник" способ сделать это с помощью новых сборок Ember будет:

App.SomeController = Ember.Controller.extend({
    needs: 'application',
    someFunction: function(){
        var state = this.get('controllers.application.currentPath');
    }
})

Это немного усложнило текущую версию для меня, но по крайней мере это работает:

var router = App.__container__.lookup("router:main"); //lookup the router
var currentHandlerInfos = r.router.currentHandlerInfos; //there are multiple handlers active at one time
var activeHandler = currentHandlerInfos[currentHandlerInfos.length - 1]; // the last item in the array is the current handler with properties like name, context, handler (Ember.Route)
var activeRoute = activeHandler.handler; //your route object

Этот код вдохновлен чтением этого Ember Source. Я еще не тестировал его в сложном приложении с большим количеством маршрутов, но я уверен, что оно будет работать нормально. Может быть, у кого-то есть более простой способ сделать это:-)

Этот пример из моего компонента. Все объекты имеют свойство - контейнер.

GetCurrentPath:-> app = @container.lookup('controller:application') return app.get 'currentPath'

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