5

Angular でビルドされたいくつかのサンプル アプリを見ています。モデルが作成/保存されている場所を探しています。次のように、モデルがプレーンな JavaScript ファイルに保存される場合があることに気付きました。

customer.js:

function customer(){
  this.firstName;
  this.lastName;
}

customer.prototype.getFullName = function(){
  return this.firstName + ' ' + this.lastName;
}

そして、私が見ているのは、ファクトリの使用です。

customerFactory.js:

app.factory("customer", function(){
  return function(){
    this.firstName;
    this.lastName;

    this.getFullName = function(){
      return this.firstName + ' ' + this.lastName;
    };
  };
});

私の質問は、モデルをどこに保存し、その理由は何ですか? 一方には他方よりも多くの利点がありますか?

4

2 に答える 2

1

と呼ばれるフォルダを作成することを好みmodels、各モデルはファクトリとして定義された独自のファイルを取得します。私は自分のモデルを定義するためにも使用しているので、呼び出し$resourceについて心配する必要はありません$http(まあ、ほとんどありません)。

なんで?これが Angular アプリの構築方法だからです。そうすることで、それらをコントローラーやディレクティブなどに注入できます。モデルをAngularにとらわれないようにしたい場合は、それで問題ありません。「ポートとアダプタ」アーキテクチャに適合します。後でファクトリとして公開するだけです。Angular に依存しないコードを別のライブラリに分割し、後で挿入できるように公開します。

app.factory("Customer", function(){ return Models.Customer; });
app.factory("Order", function(){ return Models.Order; });

また、私は自分のクラス オブジェクトに大文字で名前を付けるのが好きであることに注意してください...これは、インスタンス化される「クラス」であることを示すのが本当に好きな規則です。

于 2013-11-14T17:08:08.687 に答える
1

私は特に 2 番目のアプローチ、つまりファクトリーを使用してモデルを作成する方法を好みます。

myApp.factory('Models', [function() {
    return {
        Customer: (function() {
            var cls = function(obj) {
                this.firstName = obj && obj.firstName || null;
                this.lastName = obj && obj.lastName || null;
            }
            cls.prototype.getFullName = function() {
                return this.firstName + ' ' + this.lastName;
            };
            return cls;
        })(),
        Order: (function() {
            var cls = function(obj) {
                this.id = obj.id || null;
                this.amount = obj.amount || null;
            }
            /* methods */
            return cls;
        })()
    }
}]);

このように、コントローラーに単一の依存関係を注入するだけで、オブジェクトが定義済みのモデルであることが明示されます。

myApp.controller('myCtrl', ['$scope', 'Model', function($scope, Model) {
    $scope.customer = new Model.Customer({
        firstName: "Beterraba"
        , lastName: "Abacate"
    });
}]);
于 2013-11-14T17:01:12.623 に答える