我什么时候应该创建Angular的工厂或VM



这就是我的Angular应用的样子。

(function () {
"use strict";
angular
    .module("app")
    .controller("custCtrl", custCtrl);
custCtrl.$inject = ['dataService','custFactory'];
/* @ngInject */
function custCtrl(dataService, custFactory) {
    var vm = this;
    //line##
    vm.customer= custFactory.Create('customer');
    GetCustomers();
    function GetCustomers() {
        dataService.read().then(function (data) {
                vm.customer = data.fields;
            }
        });
    }
    return vm;
}
})();

工厂方法

(function () {
'use strict';
angular
    .module('app.factory')
    .factory('custFactory', custFactory);
custFactory.$inject = ['$q'];
/* @ngInject */
function custFactory($q) {
    var _create = function (type) {
        var obj = {};
        switch (type.toString().toLowerCase()) {
            case "customer":
                obj = new Customer();
                break;
            default:
                obj = null;
        }
        return obj;
    }
    return {
        Create: _create
    };
}
})();

查看模型

 function Customer()
 {
var dto = this;
dto.Customer = {
  "Name" : "",
  "Gender" : "", // & so on
}
 return dto;
}

如果您在//line ##上检查我的上述custCtrl,我正在调用工厂方法以实例化客户对象。

vm.customer= custFactory.Create('customer');

但是,如果我创建客户VM&工厂和简单分配一个空字符串如下。

        vm.customer= {};

仍然没有问题。

所以我的问题为什么要创建VM&工厂??它是什么 好处??

angularJS模式和最佳实践涉及遵循MV(无论如何(模式,并设计/实现具有较高内粘和低耦合的模块化组件。这样,您就可以轻松地修改一件代码,而不必在另一个代码中进行更改。

通常将工厂或服务用作客户端代码层,该代码与RESTFUL API或某种服务器端代码进行交互。通常,这是工厂的唯一功能。这样,您可以将工厂注入需要使用工厂功能的任何控制器。当您需要修改如何调用API时,您只需要对工厂进行更改,而不是每个使用该功能的控制器。

与您创建的视图模型对象类似,您只需要在一个地方进行更改即可。想象一下,拥有五个不同的控制器,都需要使用Customer对象。现在,您决定要删除Name字段,然后用FirstNameLastName替换它。您想浏览所有控制器并进行更改,还是要更改视图模型?

给您简短的答案。没有创建视图模型或工厂/服务的功能上在功能上没有什么错误。从建筑或设计的角度来看,在您的应用程序中有很大的关注,这很有意义。因此,使用工厂进行数据访问和数据对象的视图模型是有意义的。

尝试想象您的应用程序成长为具有数百个控制器/视图和数十个工厂或服务。如果您从开发开始就没有实施这些模式和最佳实践,那么维持该应用将是一个巨大的痛苦。

当您嵌套控制器时,控制器别名适合,

虽然工厂或服务适合在不同控制器之间共享数据。

例如,如果您从不同的控制器使用它,那么让您的mehtod createCustomer 很有用。由于您不存储数据,因此最好使用服务。无论如何,它允许您保存代码。

示例

var app = angular.module("myApp", []);
app.factory("myFactory", function(){
    var private = {
        users: {}
    };
    var data = {
        getUser: function(id){
             return private.users[id];
        },
        createUser: function(id){
            private.users[id] = someData;
            return private.currentUser;
        }
    };
    return data;
});

app.controller("myC1", ["myFactory", function(myFactory){
     $scope.user = myFactory.createUser(1);
}]);

app.controller("myC2", ["myFactory", function(myFactory){
     $scope.user = myFactory.getUser(1);
}]);

您看到两个控制器可以访问相同的数据

最新更新