2016-05-02 4 views
1

私はAngularJsを初めて使用しています。$ http getを使用して簡単なファクトリを作成しました。バンチまたはhttpステータスコード番号をキーとして持つ.jsonとそれぞれのメッセージを値として取得します。このエラーを取得するための、いくつかの理由contine用I:HttpステータスコードファクトリAngularJs

プロパティを読み取ることができません '取得'

未定義JSONの:

{ 
    "200": "Ok", 
    "201": "Created", 
    "202": "Accepted", 
    "404": "Not_Found", 
    "400": "Bad Request", 
    "403": "Forbidden", 
    "417": "Expectation Failed" 
} 

factory.js

.factory('statusCodesFactory', function() { 

       var httpStatusCodes = { 
        getStatus: function ($http) { 
         $http.get('catalog/statusCodes.json') 
          .then(function (response) { 
           httpStatusCodes.code = response; 
          }); 
        } 
       } 
       return httpStatusCodes; 
      }) 

答えて

5

ます'$ http'の依存関係を適切に渡す必要があります。

.factory('statusCodesFactory', ['$http', function ($http) { 
    var httpStatusCodes = { 
     getStatus: function() { 
      $http.get('catalog/statusCodes.json') 
       .then(function (response) { 
        httpStatusCodes.code = response; 
       }); 
      } 
     } 
     return httpStatusCodes; 
    }); 

これはあなたの関数が本当に何も返さないということです。それのためのよりよいフォーマットは、これを次のようになります。このよう

.factory('statusCodesFactory', ['$http', function ($http) { 
    var httpStatusCodes = { 
     getStatus: function() { 
      return $http.get('catalog/statusCodes.json') 
       .then(function (response) { 
        return response; 
       }); 
      } 
     } 
     return httpStatusCodes; 
    }); 

と呼ば:

var statusCodes = {}; 
statusCodesFactory.getStatus().then(function(response){ 
    statusCodes = response; 
}); 
+0

はあなたの例を踏襲し、私は私の工場を呼び出しています私はどこにconsole.logをログに記録(statusCodesFactory.getStatus());それは定義されていないと言います。 – user2402107

+1

その約束を解決する方法がなければ、私はそれを期待します。 console.logを使用しても、関数内の約束は解決されません。 – MBielski

+0

データを約束から外すにはどうすればよいですか? – user2402107

0

エラーが$httpundefinedあるので、あなたが$http上のメソッドgetを呼び出すことはできませんと言っています。 パラメーターがgetStatus: function($http)...に渡されていることは、この問題の根本原因です。あなたはその関数に何が渡されているのか、なぜ空のオブジェクトであるのかを理解する必要があります。

1

工場に$ httpサービスを注入します。

.factory('statusCodesFactory', ['$http', function ($http) { 
    return { 
     getStatus: function() { 
      $http.get('catalog/statusCodes.json') 
       .success(function (response) { 
        // 
       }); 
      } 
     } 
    }; 
}]); 

のInvoke関数として -

statusCodesFactory.getStatus(); 

あなたは、コントローラの約束を使用するように戻って応答を返すために必要がある場合。

.factory('statusCodesFactory', ['$http', '$q', function ($http, $q) { 
    return { 
     getStatus: function() { 
      var defer = $q.defer(); 
      $http.get('catalog/statusCodes.json') 
       .success(function (response) { 
        defer.resolve(response); 
       }); 
      } 
      return defer.promise; 
     } 
    }; 
}]); 

はその後、コントローラからファクトリメソッドを呼び出す - - $ Qサービスを注入し

statusCodesFactory.getStatus().then(function(response){ 
    // Use response 
}); 
+0

@ user2402107応答を返すには、約束を使わなければなりません。 2番目のアプローチ、 '$ q'を使用してください。 –

+0

これはpromiseアンチパターン(これは良いことではありません)を使用しますが、それ以外は正しいです。 – MBielski

+0

延期約束アンチパターン:http://stackoverflow.com/questions/31024021/create-promise-in-angularjs – MBielski