8

私の app.js には

var app = angular.module('myApp', []).
config(['$routeProvider', function ($routeProvider, $http) {
    ...
}]);

サービスは次のようになります

app.service('MyService', function () {
    addNums = function (text) {
        return text + "123";
    }
});

そして、コントローラーで私は持っています

function adminCtrl ($scope, MyService) {
    $scope.txt = MyService.addNums("abc");
};

それらはすべて別のファイルにあります。問題は、エラーが発生することです Unknown provider: MyServiceProvider <- MyService

私は何か間違ったことをしているようです。

4

3 に答える 3

11

Angular に myApp モジュールをロードするように指示するのを忘れた場合、プロバイダー エラーが発生する可能性があります。たとえば、あなたの index.html ファイルにこれがありますか?:

<html ng-app="myApp">

サービスに「これ」がありません:

this.addNums = function(text) {

フィドル


Angular コミュニティでは、service() と factory() をいつ使用するか、およびそれらを適切にコーディングする方法について、多くの混乱があるようです。だから、ここに私の簡単なチュートリアルがあります:

service() メソッドは、 JavaScript コンストラクター関数を想定しています。service() を使用する多くの Angular コード例には、コンストラクター関数ではないコードが含まれています。多くの場合、それらはオブジェクトを返しますが、これは service() を使用する目的に反するものです — これについては以下で詳しく説明します。オブジェクトを作成して返す必要がある場合は、代わりに factory() を使用できます。多くの場合、必要なのはコンストラクター関数だけであり、service() を使用できます。

以下の引用は、さまざまな AngularJS Google グループの投稿からのものです。

factory() と service() の使用の主な違いは、factory() はオブジェクトを返さなければならないのに対し、service() は何も返さず、オブジェクト コンストラクタ関数でなければならないことです。

提供している関数が必要なオブジェクトを構築する場合は、factory() を使用します。つまり、Angular は基本的に
obj = myFactory()
を実行して obj を取得します。提供する関数が必要なオブジェクトのコンストラクターである場合は、service() を使用します。つまり、Angular は基本的に
obj = new myService() を実行
して、obj を取得/インスタンス化します。

そのため、人々が service() を使用し、そのコードがオブジェクトを「返す」場合、JavaScript の「new」が機能する方法のために、それは一種の無駄です: 、次に myService() で定義された関数を呼び出します。 -- 詳細はここではあまり気にしません)、しかし myService() で定義された関数は独自のオブジェクトを返すため、「new」は奇妙なことを行います:作成に時間が費やされたオブジェクトを破棄し、 myService() 関数が作成したオブジェクトを返すため、「無駄」になります。

service() が導入された理由の 1 つは、サービスを coffeescript クラスとして定義するなど、「古典的な」OO 手法を簡単に使用できるようにすることでした。

また、文書化されていないサービスの命名規則は、最初の文字を小文字にしたキャメルケースのようです: たとえば、myService.

于 2012-11-15T21:33:35.307 に答える
2

ブライアンの回答に追加の説明として、コードで MyService.addNums を呼び出したい場合は、次を使用できます。

app.service('MyService', function() {
    var result = {};
    result.addNums = function (text) {
        return text + "123";
    };

    return result;
});

その後、まだ使用できます

MyService.addNums("abc");

あなたがそうしたいなら。  

于 2012-11-15T17:32:55.003 に答える
2

app.service コールバックで addNums を返す必要があります。

app.service('MyService', function () {
  addNums = function (text) {
    return text + "123";
  }
  return addNums;
});

これで、MyService を使用するたびに、Angular は使用する addNums 関数を返します。

したがって、コントローラーで次のように使用する必要があります ( addNums 呼び出しがないことに注意してください)。

function adminCtrl ($scope, MyService) {
  $scope.txt = MyService("abc");
};
于 2012-11-15T16:02:44.243 に答える