2016-01-15 59 views
2

我目前正在與firebase(使用angularFire)一起提供firebase數組和對象的許多工廠。當routeParameter更改時,AngularFire在工廠中更改參考

只要路由參數「element_id」發生變化,我需要在會話中多次更改所有factorys的引用,但是一旦第一次調用它們,angularjs就會加載所有的工廠,而且我沒有看到更新引用之後的方法這個最初的呼叫。

我試着重裝使用的應用程序

$route.reload(); 

這什麼都沒有改變和

$window.location.reload(); 

這情況造成錯誤404,因爲這個頁面是不是在HTML5模式可用本地主機:8000 /部件1是不存在或在沒有使用html5模式時將我帶回localhost:8000沒有我的element_id。

這裏是我的工廠與我的根火力工廠之一:

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工廠返回一個函數,該工廠可以基於一個id構造一個$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'來訪問新的路由參數。 - [AngularJS $ routeParams API參考](https://docs.angularjs.org/api/ngRoute/service/$routeParams)。 – georgeawg

+0

很好,@georgeawg!我會更新。 –

+0

您還需要路線中的參數。就像'.when('/ somepath /:element_id'' – georgeawg