我目前在使用工厂服务和AngularFire更新范围时遇到问题。我认为代码不言自明:
//Creates firebase object based on URL ($stateParams as an ID)
jobControllers.factory('Job', getJobService);
function getJobService($firebaseObject, $stateParams) {
var ref = new Firebase("<my firebase url>" + $stateParams.jobId);
return $firebaseObject(ref);
}
//Sets Scope to firebase object in getJobService
jobControllers.controller('JobCtrl', function ($scope, $location, Job) {
$scope.job = Job;
});
这很好用,当您单击/ jobs /:jobId /这样的链接时,它会加载正确的数据。问题是一旦你回到/ jobs /并点击另一个:jobId数据保持不变。我相当确定问题是我的firebase URL保持不变并且$ stateParams在控制器负载上没有变化,因此数据使用URL对于单击的第一个项目。如果是这种情况,我如何更改我的工厂以获取参数,以便我可以在控制器中将正确更新的$ stateParams传递给它?
当我在控制器中调用我的firebase对象时,我之前没有遇到这个问题:
jobControllers.controller('JobCtrl', function ($scope, $location, $stateParams, $firebaseObject) {
var ref = new Firebase("<my firebase url>" + $stateParams.jobId);
$scope.job = $firebaseObject(ref);
});
我使用工厂的原因是因为我不喜欢在每个不同的控制器中定义firebase URL,所以我想为此创建一个可重用的服务。如果有更好的方法 - 请告知。
编辑:感谢charlieftl
计算出来function getFireBaseService($firebaseArray, $firebaseObject) {
return {
getArray: function(url) {
var ref = new Firebase("https://<my-app>.firebaseio.com" + url);
return $firebaseArray(ref);
},
getObject: function(url) {
var ref = new Firebase("https://<my-app>.firebaseio.com" + url);
return $firebaseObject(ref);
}
}
}
答案 0 :(得分:1)
问题是工厂是单件并且只初始化一次。您的方法只会在初始化时使用$stateParams.jobId
的任何值
使用函数返回firebase对象,以便每次调用它时都会运行
function getJobService($firebaseObject, $stateParams) {
function getJob() {
var ref = new Firebase("<my firebase url>" + $stateParams.jobId);
return $firebaseObject(ref);
}
//return object from factory
return {
getJob: getJob
}
}
然后在控制器中
$scope.job = Job.getJob();