2013-11-14 77 views
5

我正在看一些使用Angular構建的示例應用程序。我正在查看模型的創建/存儲位置。我注意到,有時模型存儲在一個普通的JavaScript文件,像這樣:你在哪裏存儲/創建你的模型在Angular中?

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; 
    }; 
    }; 
}); 

所以我的問題是,你在哪裏存儲你的模型,爲什麼?這個人比另一個人更有優勢嗎?

回答

1

我特別喜歡第二種方法,那就是使用工廠來創建模型。

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" 
    }); 
}]); 
+0

謝謝,只是出於好奇:1)'cls'代表什麼意思。 2)爲什麼Customer對象自己調用? 3)你把所有的模型放在同一個工廠嗎? – Martijn

+0

@Martijn(1)「cls」代表「class」,即js中的保留字。 (2)對象自我調用,因此只評估一次自己的身體。如果這是一個正常的功能,每個「新」電話會再次評估整個班級。 (3)我喜歡把所有東西放在一個工廠裏,以避免在控制器中注入幾次。 – Beterraba

1

我希望創建一個名爲models文件夾,每個模型都有自己的文件,定義爲一個工廠。我還使用$resource來定義我的模型,以便我永遠不需要擔心$http調用(很好,幾乎從不)。

爲什麼?因爲這是Angular應用程序的構建方式。這樣做可以讓你將它們注入你的控制器,指令等等。如果你希望你的模型是Angular不可知的,那很好。它符合「端口和適配器」體系結構。稍後將它們作爲工廠展示。分離您的角度無關的代碼放到一個獨立的庫,然後只需將其暴露於注射後:

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

而且,我喜歡我的名字的類對象與首都...通知這是一個慣例我真的很喜歡以表明它是一個「類」被實例化。

+0

謝謝,所以在你的情況下,定義模型有兩種方法:一種在文件中,一種在使用資源?有了Angular不可知論,你的意思是不知道Angular?所以只是簡單的JavaScript? – Martijn

+1

對。就個人而言,我更願意把它全部放在服務中。然而,有些人喜歡說你的模型/ buisiness logic/utilty代碼只是純JavaScript並且對Angular一無所知的「ports and adapters」風格的架構。然後,你就像上面那樣把它連接起來。在這個例子中,Model.Customer只是純JavaScript,並不在Angular的限制範圍內,但是它使用「工廠」來「適應」。 –