2013-12-25 2 views
2

Скажем, использовали PushState для навигации маршрутов:

$locationProvider.html5Mode(true); 

И Есть два пути с двумя различными контроллерами:

$stateProvider.state('one', { 
    url:'/one', 
    templateUrl:'one.html', 
    controller: 'oneCtrl' 
}); 

$stateProvider.state('two', { 
    url:'/two', 
    templateUrl:'two.html', 
    controller: 'twoCtrl' 
}); 

oneCtrl создает новую ссылку на тот же ресурс, что и у twoCtrl:

.controller('oneCtrl', ["$scope", "$firebase", function($scope, $firebase) { 

    var oneRef = new Firebase("https://example.firebaseio.com/stuff"); 
    $scope.stuff = $firebase(oneRef); 
    $scope.stuff.$on("loaded", function(value) { 
    console.log(value); 
    }); 
}]) 

.controller('twoCtrl', ["$scope", "$firebase", function($scope, $firebase) { 

    var twoRef = new Firebase("https://example.firebaseio.com/stuff"); 
    $scope.stuff = $firebase(twoRef); 
    $scope.stuff.$on("loaded", function(value) { 
    console.log(value); 
    }); 
}]) 
  • Если мы перейдем на страницу /one, то событие $on("loaded") будет происходить как ожидалось - уникально для oneRef.
  • Если мы переместимся от /one в /two, то событие $on("loaded") не срабатывает.

Если новый исх был экземпляр - twoRef - почему не обратный вызов огнестойкость второй раз?

ответ

3

Это связано с тем, что локально кэшированные данные запускают события value синхронно в Firebase.

При первой нагрузке сервер связывается асинхронно с помощью метода ang12Fire's _getInitialValue. Тем не менее, при втором загрузке, поскольку значение уже локально, broadcast event происходит синхронно, и поэтому перед тем, как ваш $ on ('загруженный' ...) обработчик будет привязан.

Приходят в голову следующие мысли: если контроллеры используют одни и те же данные о платной базе данных, в большинстве случаев использования, вероятно, должно быть только одно. Он должен быть перемещен в службу и передан соответствующим образом.

Другим обходным решением было бы сохранить загруженное состояние в службе или в $ rootScope.

В конечном счете, это должно быть corrected in angularFire, так что загруженное событие запускается, даже если «значение» уже загружено синхронно.

+0

Спасибо! - Кстати, это был лишь минимальный пример. Существует случай, когда я столкнулся с тем, где мне нужен идентификатор из значения первой коллекции в 'controller1', чтобы запросить вторую коллекцию в' controller2'. В частности - '/ articles/list' (возвращает' articleIndex' коллекция, которая сопоставляет генерируемые коллекции 'articles' с идентификаторами * в именах названий пулов заголовков *) и'/articles/edit /: id'. Например, 'my-seo-title: {article: '- JaX328-e32'}' - шаблон, рекомендованный мне здесь: http://stackoverflow.com/questions/20735728/correct-way-to-model-a- коллекторно-из-элементов-в-firebase # комментарий-31095052 –

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