2016-12-29 147 views
2

我厂拥有这样的:Angularjs保留局部变量

TestFactory= function() { 
    var objectName=null; 

    return { 
     SetName:function(name) { 
      objectName = name; 
     }, 
     GetName:function() { 
      return objectName; 
     }, 
     Init:function() { 
      return angular.copy(this); 
     } 
    } 
} 

的控制器,如:

TestController = function($scope) { 
    $scope.TestClick = function() { 

     var tstA = TestFactory.Init(); 
     var tstB = TestFactory.Init(); 

     tstA.SetName('test A') 
     tstB.SetName('test B') 

     console.log('A', tstA.GetName()); 
     console.log('B', tstB.GetName()); 

    } 
} 

在控制台中我得到Test B两个对象。

我该如何制作此对象的适当实例?

我想在工厂的其他功能中使用objectName值。

回答

2

考虑到在Angular中,工厂是单身人士,所以实例总是相同的。

你可以做到以下几点:

TestFactory= function() { 
    var objectName={}; 

    return { 
     SetName:function(property,name) { 
      objectName[property] = name; 
     }, 
     GetName:function(property) { 
      return objectName[property]; 
     }, 
     Clear:function(property) { 
      delete objectName[property] 
     } 
    } 
} 

然后在你的控制器:

TestController = function($scope, TestFactory) { 
    $scope.TestClick = function() { 

     TestFactory.SetName('a','test A') 
     TestFactory.SetName('b','test B') 

     console.log('A', TestFactory.GetName('a')); // test A 
     console.log('B', TestFactory.GetName('b')); // test B 

    } 
} 
+0

所以我要告诉每一个随之而来的功能键巫婆看这么说 会工作,但不愉快的解决方案:) – Jester

+0

我接受了这个因为这一切是最接近的,因为它得到。只是为了解决这个问题的人。请找到解决此问题的方法。我最终将一个包含所有相关数据的对象传递给工厂的每个连续函数调用,这样我就不需要上述那样。既然它不是'角度的方式' – Jester

1

几个问题。首先你从工厂返回一个对象而不是一个函数。

app.factory('TestFactory', function() { 
    return function() { 
    var objectName = null; 

    var setName = function(name) { 
     objectName = name; 
    }; 

    var getName = function() { 
     return objectName; 
    }; 

    return { 
     SetName: setName, 
     GetName: getName 
    }; 
    }; 

}); 

然后,你可以实例化这样的:

var tstA = new TestFactory(); 
var tstB = new TestFactory(); 
1

服务和工厂都是单身,所以我想通过提供Init功能,你可以达到你想要的东西了更为适合的工厂是返回通用代码和独特的名称,像这样:

angular.module('app') 
     .factory('ServiceFactory', serviceFactory); 

function serviceFactory() { 
    return { 
     Init: function (name) { 
      return { 
       objectName: name, 
       setName: function (name) { 
        this.objectName = name; 
       }, 
       getName: function() { 
        return this.objectName; 
       } 
      }; 
     } 
    }; 
} 

这使得使用它作为一个工厂,可以初始化多种类型的可能性。

0

你基本上需要创建一个简单的getter/setter。

angular.module('app', []) 
 
    .controller('TestController', testController) 
 
    .service('serviceFactory', serviceFactory); 
 

 

 
testController.$inject = ['serviceFactory']; 
 

 
function testController(serviceFactory) { 
 

 
    serviceFactory.set('A', { 
 
    name: 'test A' 
 
    }); 
 

 
    serviceFactory.set('B', { 
 
    name: 'test B' 
 
    }); 
 

 
    console.log(serviceFactory.getAll()); 
 
    console.log(serviceFactory.get('A')); 
 
    console.log(serviceFactory.get('B')); 
 

 
} 
 

 
function serviceFactory() { 
 
    var 
 
    _model = { 
 
    name: "" 
 
    }, 
 
    _data = {}; 
 

 
    return { 
 
    set: function(key, data) { 
 
     _data[key] = angular.extend({}, _model, data); 
 
    }, 
 
    get: function(key) { 
 
     return _data[key]; 
 
    }, 
 
    getAll: function() { 
 
     return _data; 
 
    } 
 
    } 
 

 

 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.22/angular.min.js"></script> 
 

 
<body ng-app="app" ng-controller="testController"></body>