Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Angular Service中使用$http-无法读取属性';邮政';未定义的_Javascript_Angularjs_Dependency Injection - Fatal编程技术网

Javascript 在Angular Service中使用$http-无法读取属性';邮政';未定义的

Javascript 在Angular Service中使用$http-无法读取属性';邮政';未定义的,javascript,angularjs,dependency-injection,Javascript,Angularjs,Dependency Injection,我正试图学习如何使用Angular right,将所有业务逻辑都放在服务中 在服务中执行post请求时,出现以下错误: Cannot read property 'post' of undefined 下面是一些代码: UrlApp.controller('UrlFormCtrl', UrlFormCtrl); UrlApp.factory('addUrlService', addUrlService); function UrlFormCtrl($sc

我正试图学习如何使用Angular right,将所有业务逻辑都放在服务中

在服务中执行post请求时,出现以下错误:

Cannot read property 'post' of undefined
下面是一些代码:

      UrlApp.controller('UrlFormCtrl', UrlFormCtrl);

      UrlApp.factory('addUrlService', addUrlService);

      function UrlFormCtrl($scope, $http) {
        console.log('Url Form Controller Initialized');
        $scope.addUrl = addUrlService.bind(null, $http);
      }

      function addUrlService($scope, $http){
        console.log('initializing addUrlService');
        return $http.post('urls/create', {'test':'test'}).then(function(response){
          return response.data;
        });
      }

我只是掌握了角度的窍门,所以我不完全确定我做错了什么。看到问题了吗?

首先,您不需要在服务中注入
$scope

 Can you try like this

 UrlApp.controller('UrlFormCtrl', UrlFormCtrl); 
 UrlApp.factory('addUrlService', addUrlService);

  function UrlFormCtrl($scope,addUrlService) {
    console.log('Url Form Controller Initialized');
    $scope.addUrl = addUrlService;
  }

  function addUrlService($http){
    console.log('initializing addUrlService');
    return $http.post('urls/create', {'test':'test'}).then(function(response){
      return response.data;
    });
  }
其次,您不需要在控制器中注入
$http
服务

第三,您需要在控制器中注入服务

最后,
addUrlService
服务返回一个承诺,意思是在实例化服务时它将发出请求。您可能希望返回一个函数或包含多个函数的对象

因此,我将您的代码更改为:

UrlApp.controller('UrlFormCtrl', UrlFormCtrl);
UrlApp.factory('AddUrlService', AddUrlService);

function UrlFormCtrl($scope, AddUrlService) {
    $scope.addUrl = AddUrlService.addUrl;
}

function AddUrlService($http) {

    function addUrl() {
        return $http.post('urls/create', {
            'test': 'test'
        }).then(function (response) {
            return response.data;
        });
    }

    return {
        addUrl: addUrl
    };
}

您可以将依赖注入(或di)添加到问题标签中,因为这是相关的。谢谢,一个服务应该用于一个控制器还是多个控制器?假设我有一个控制器处理表单,另一个控制器在表中列出。使用一个全方位的UrlService是合适的还是两个?@kinx您应该尽可能使服务可重用。angular中的服务在应用程序中作为单例工作,因此当我希望应用程序中的多个模块使用一个服务时,我会将其设置为无状态。我不知道您的应用程序,但此服务可以是一个通用的
UrlService
(而不是
AddUrlService
),它是管理某些数据库中URL的CRUD。因此,它可以被任何控制器、服务使用。谢谢,@Letiagolves,最后一个问题:最后一个return语句,我知道它返回了一个json对象,但是,你在这里做的事情:addUrl:addUrl真的让我困惑,因为你只是重复了两次。介意解释一下吗?@kinx你说得对。它正在返回一个文本
对象
。该对象有一个名为
addUrl
的属性,该属性引用函数
addUrl
。我为函数和对象属性指定了相同的名称,但您不需要这样做。如果需要,可以更改函数名和属性名。例如:
add:addUrl
。但是,如果您更改属性名称,请不要忘记在控制器中也进行更改。您好,当我需要在ng单击后运行服务时,这似乎会在页面加载上运行。