Angular:使用工厂服务更新范围

时间:2016-01-12 21:10:19

标签: javascript angularjs parameters angularfire

我目前在使用工厂服务和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);
    }
  }
}

1 个答案:

答案 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();