为什么我一直在angularJS中获取未定义的TypeError设置属性

Why I keep getting TypeError setting property of undefined in angularJS?

本文关键字:TypeError 设置 属性 未定义 获取 我一直在 angularJS 为什么      更新时间:2023-09-26

我正在写一个微博应用程序来自学angularJS。

现在一个烦人的问题是,我在服务、工厂和供应商方面都搞得一团糟。在搜索了它们之间的差异后,我选择了服务来填补我的应用程序中的帖子部分。

但后来我一直得到错误:TypeError:无法设置未定义的属性"get"

我的服务代码看起来像:

angular.module('mblogApp.services',[]).
  service('Posts', function(){
    var posts = [];
    this.prototype.get = function(){return posts};
    this.prototype.push = function(user, text){
          var post = {
               user: user,
               text: text,
               time: Date.now()
          };
          posts.push(post);
     };
});

在我的控制器里,我写了一些类似的东西:

angular.module('mblogApp.controllers').
  controller('makePostCtrl', ['Posts', function($scope, Posts){
    posts.push($scope.user, $scope.text);
  }]).
  controller('showPostCtrl', ['Posts', function($scope, Posts){
    $scope.posts = Posts.get();
  }
]);

感谢任何良好的做法。:)。


这个问题让我很难受。我真的厌倦了。我试着让它变得简单,找出错误的来源,并将我的代码重写到一个html文件中,如下所示:

<!DOCTYPE html>
<html ng-app="app">
<head>
  <title>Angular Service Demo</title>
  <script type="text/javascript" src="angular/angular.js"></script>
</head>
<body>
  <div ng-controller="makePostCtrl">
    <label for="name">Name: </label>
    <input type="text" ng-model="name">
    <br>
    <label for="text">Text: </label>
    <input type="text" ng-model="text">
    <br>
    <button ng-click="post()">post</button>
  </div>
  <div ng-controller="showPostCtrl">
    <ul>
      <li ng-repeat="post in posts">
        <p>Name: {{post.name}}</p>
        <p>Text: {{post.text}}</p>
      </li>
    </ul>
  </div>
</body>
<script type="text/javascript">
var app = angular.module('app', []);
app.service('posts', function(){
  this.posts = function(){
    var posts = [];
    return {
      get: function(){return posts},
      push: function(user, text){
        posts.push({
          user: user,
          text: text
        });
      }
    };
  };
});
app.controller('makePostCtrl    ', ['posts',function($scope, posts){
  $scope.post = function(){
    posts.push($scope.user, $scope.text);
  };
  $scope.posts = posts.get();
}]);
app.controller('showPostCtrl')
</script>
</html>

错误如下:

TypeError:无法调用未定义的方法"get"

将服务代码更改为:

app.service('posts', function () {
    var posts = [];
    return {
        get: function () {
            return posts
        },
        push: function (user, text) {
            posts.push({
                user: user,
                text: text
            });
        }
    };
});

并且模块是按顺序注入的,您错过了"$scope",因此模块注入不匹配。

app.controller('makePostCtrl', ['$scope', 'posts', function ($scope, posts) {

我认为您的服务缺少依赖项注入。试试这个

angular.module('mblogApp.controllers',['mblogApp.services']).

试试这个代码。

在你的服务中做出这样的改变;

angular.module('mblogApp'). service('Posts', function(){
  var post_values = [];
return {
  get : function(){
            return post_values
             },
   push : function(user, text){
      var post = {
          user: user,
          text: text,
          time: Date.now()
      };
      post_values.push(post);
  }
};
});

还有你的控制器;

    var app = angular.module('mblogApp');
    app.controller('makePostCtrl', ['Posts', function ($scope, Posts) {
        Posts.push($scope.user, $scope.text);
    });
   app.controller('showPostCtrl', ['Posts', function ($scope, Posts) {
        $scope.posts = Posts.get();
    });