猿问

将$ scope注入角度服务函数()

将$ scope注入角度服务函数()

我有一个服务:

angular.module('cfd')
  .service('StudentService', [ '$http',
    function ($http) {
    // get some data via the $http
    var path = 'data/people/students.json';
    var students = $http.get(path).then(function (resp) {
      return resp.data;
    });     
    //save method create a new student if not already exists
    //else update the existing object
    this.save = function (student) {
      if (student.id == null) {
        //if this is new student, add it in students array
        $scope.students.push(student);
      } else {
        //for existing student, find this student using id
        //and update it.
        for (i in students) {
          if (students[i].id == student.id) {
            students[i] = student;
          }
        }
      }
    };

但是当我打电话时save(),我无法访问$scope,并得到ReferenceError: $scope is not defined。所以逻辑步骤(对我而言)是提供save()$scope,因此我还必须提供/注入它service。所以,如果我这样做:

  .service('StudentService', [ '$http', '$scope',
                      function ($http, $scope) {

我收到以下错误:

错误:[$ injector:unpr]未知提供者:$ scopeProvider < - $ scope < - StudentService

错误中的链接(哇哇哇!)让我知道它与注入器相关,并且可能与js文件的声明顺序有关。我曾尝试重新排序它们index.html,但我认为它更简单,例如我注入它们的方式。

使用Angular-UI和Angular-UI-Router


largeQ
浏览 589回答 3
3回答

慕运维8079593

$scope您可以$watch在控制器中实现a,而不是尝试修改服务内部,以便在服务上查看属性以进行更改,然后更新属性$scope。以下是您可以在控制器中尝试的示例:angular.module('cfd') &nbsp;&nbsp;&nbsp;&nbsp;.controller('MyController',&nbsp;['$scope',&nbsp;'StudentService',&nbsp;function&nbsp;($scope,&nbsp;StudentService)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$scope.students&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(function&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$scope.$watch(function&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;StudentService.students; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;function&nbsp;(newVal,&nbsp;oldVal)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;newValue&nbsp;!==&nbsp;oldValue&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$scope.students&nbsp;=&nbsp;newVal; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}()); &nbsp;&nbsp;&nbsp;&nbsp;}]);需要注意的一点是,在您的服务中,为了使students属性可见,它需要在Service对象上,或者this像这样:this.students&nbsp;=&nbsp;$http.get(path).then(function&nbsp;(resp)&nbsp;{ &nbsp;&nbsp;return&nbsp;resp.data;});

侃侃尔雅

好吧(很长一段)...如果你坚持要$scope在服务中访问,你可以:创建一个getter / setter服务ngapp.factory('Scopes',&nbsp;function&nbsp;(){ &nbsp;&nbsp;var&nbsp;mem&nbsp;=&nbsp;{}; &nbsp;&nbsp;return&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;store:&nbsp;function&nbsp;(key,&nbsp;value)&nbsp;{&nbsp;mem[key]&nbsp;=&nbsp;value;&nbsp;}, &nbsp;&nbsp;&nbsp;&nbsp;get:&nbsp;function&nbsp;(key)&nbsp;{&nbsp;return&nbsp;mem[key];&nbsp;} &nbsp;&nbsp;};});注入它并将控制器范围存储在其中ngapp.controller('myCtrl',&nbsp;['$scope',&nbsp;'Scopes',&nbsp;function($scope,&nbsp;Scopes)&nbsp;{ &nbsp;&nbsp;Scopes.store('myCtrl',&nbsp;$scope);}]);现在,将范围放在另一个服务中ngapp.factory('getRoute',&nbsp;['Scopes',&nbsp;'$http',&nbsp;function(Scopes,&nbsp;$http){ &nbsp;&nbsp;//&nbsp;there&nbsp;you&nbsp;are &nbsp;&nbsp;var&nbsp;$scope&nbsp;=&nbsp;Scopes.get('myCtrl');}]);
随时随地看视频慕课网APP

相关分类

AngularJS
我要回答