【发布时间】:2015-09-04 11:29:05
【问题描述】:
我编写了一个自定义下拉选项选择器,一切都很好,它具有获取数据(从传入的 url)来填充列表的功能。
现在我想做的是重用这个组件但是...... 当我将它添加到应用程序的另一部分,但使用不同的数据集时,它会复制数据并多次运行控制器功能。
据我所知 1 有两个问题,服务是单例的,所以当我运行该函数来填充一些数据时,因为只有一个服务实例,它只是将它添加到当前数据集。
那么另一个问题是控制器确实有实例,所以现在有两个,它运行每个中的功能。
因此,简单的解决方案是复制组件并将其命名为不同的名称,虽然这可能会解决问题,但如果我想重复使用 10 次,那就是同一个组件的 10 个副本,不好。
我来自 OOP Java 背景,所以我可能正在尝试在不支持它的语言中使用这些技术;)
所以我知道我必须重新考虑如何做到这一点,但我遇到了一些困难,最好的方法是什么?
这是(希望如此)一个 JSFiddle,它说明了我正在运行的内容
var app = angular.module('myApp',[]);
app.directive('mySelector', function () {
return {
scope: {
mydata: '='
},
restrict: 'EA',
template:'<select ng-model="timePeriodSelection" ng-options="timePeriodOption.name for timePeriodOption in timePeriodOptions"><option value="">Choose time period</option></select>',
controller: function($scope, myService) {
//$scope.name = 'Superhero';
console.log('test',$scope.mydata);
myService.setData($scope.mydata);
$scope.timePeriodOptions = myService.getData();
console.log('test2',myService.getData());
}
};
});
app.factory('myService', function() {
var _data=[];
return {
setData: function(value){
for (var a=0;a<value.length;a++){
_data.push(value[a]);
}
},
getData: function(){
return _data
}
}
});
https://jsfiddle.net/devonCream/ess9d6q6/
出于商业原因,我无法向您展示我拥有的代码,但想象一下我传入的实际上是一个 url,我有一个服务可以获取数据,然后将其存储在服务/工厂的数组中,每次运行时,它都会不断添加它们!该代码是一个模拟演示。
【问题讨论】:
-
您能否提供所有代码并在 plunker 中突出显示问题? (你可以 fork 和编辑这个plnkr.co/edit/b8sxOLNgGKZ36oQDGJLM?p=preview)
-
遗憾的是,自从它关闭源代码以来,我已经设置了一个 jsfiddle 来展示我的问题,
标签: javascript angularjs oop controller singleton