2016-01-15 1 views
2

В настоящее время я работаю над угловым приложением с использованием firebase (с использованием углового Fire) с множеством заводов, предоставляющих массивы и объекты Firebase.AngularFire заменяет ссылку на заводе, когда routeParameter изменяет

Мне нужно изменить ссылки всех фабрик несколько раз в сеансе всякий раз, когда изменяется параметр route "element_id", но angularjs загружает все фабрики после их первого вызова, и я не вижу способа обновить ссылку после этот начальный вызов.

Я попытался перезагрузить приложение, используя

$route.reload(); 

, который не изменил ничего и

$window.location.reload(); 

, которые вызваны либо ошибка 404, потому что эта страница не доступна в режиме html5 локального хоста: 8000/element1 является не существует или вернул меня на localhost: 8000 без моего элемента element, когда я не использовал html5 режим.

Вот один из моих заводов с моей корневой firebase завода:

app.factory("fireroot", function(){ 
    var reference = new Firebase("https://mybase.firebaseio.com"); 
    return reference; 
}); 

app.factory('core_data', function($firebaseObject, fireroot, $routeParams) { 
    var reference = fireroot.child("elements").child($routeParams.element_id).child("core-data"); 
    var core_data = $firebaseObject(reference); 

    return core_data; 
}); 

Большое спасибо за вашу помощь, я только сделал свои последние годы кодирования благодаря этому сообществу, наконец, пришло время принять активное участие :) ,

+0

заводы ** одиночек **. Если вы хотите, чтобы при изменении маршрута что-то типа «core_data» изменилось, вы должны поместить его в функцию распознавания вашего маршрута. – georgeawg

ответ

2

Отличное время для начала участия!

Не вводите $routeParams на заводе. Используйте это внутри контроллера или, еще лучше, маршрутизатор .

Попробуйте вернуть функцию с завода core_data, который может построить $firebaseObject на основе идентификатора.

Затем в объекте разрешения на маршруте вы можете получить доступ к $routeParams и построить $firebaseObject. Затем вы можете вернуть обещание $loaded(), поэтому Angular загрузит представление, когда обещание будет разрешено.

Теперь ваш контроллер очень тонкий, потому что конфигурация сделала для вас трудную часть.

angular.module('app', ['ngRoute', 'firebase']) 
    .factory('coreData', CoreDataFactory) 
    .controller('MyCtrl', MyController) 
    .config(ApplicationConfig); 

function CoreDataFactory($firebaseObject, fireroot) { 
    return function(id) { 
    var ref = fireroot.child("elements").child(id).child("core-data"); 
    return $firebaseObject(ref); 
    } 
} 

function ApplicationConfig($routeProvider) { 
    $routeProvider.when('/path/:element_id', { 
    controller: 'MyCtrl as ctrl', 
    view: 'view.html', 
    resolve: { 
     data: function(coreData, $route) { 
     return coreData($route.current.params.element_id).$loaded(); 
     } 
    } 
    }); 
} 

function MyController(data) { 
    this.coreData = data; 
} 

And incase you are wondering, the format comes from the Angular Styleguide.

+0

Обратите внимание, что '$ routeParams' обновляются только после успешного изменения маршрута. Это означает, что вы не можете полагаться на '$ routeParams' правильные в функции разрешения маршрута. Вместо этого вы можете использовать '$ route.current.params' для доступа к параметрам нового маршрута. - [Ссылка на API-интерфейс AngularJS $ routeParams] (https://docs.angularjs.org/api/ngRoute/service/$routeParams). – georgeawg

+0

Хороший улов, @georgeawg! Я обновлю. –

+0

Также вам нужен параметр в маршруте. Что-то вроде '.when ('/ somepath /: element_id'' – georgeawg

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