2016-12-29 340 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>