Javascript 如何消除角度控制器中的代码重复?
我有两个控制器,它们执行非常相似的任务 消除代码重复的适当方法是什么 最初,我尝试将创建模板方法作为angular服务,但看起来我无法向服务注入$scopeJavascript 如何消除角度控制器中的代码重复?,javascript,angularjs,refactoring,code-duplication,Javascript,Angularjs,Refactoring,Code Duplication,我有两个控制器,它们执行非常相似的任务 消除代码重复的适当方法是什么 最初,我尝试将创建模板方法作为angular服务,但看起来我无法向服务注入$scope .controller("TspController", function($scope, $rootScope, $routeParams, $location, ProblemsLoader) { $scope.problemType = "tsp"; var problemId = $routeParams.probl
.controller("TspController", function($scope, $rootScope, $routeParams, $location, ProblemsLoader) {
$scope.problemType = "tsp";
var problemId = $routeParams.problemId;
ProblemsLoader.loadIndex("tsp", function(index) {
if (problemId) {
$scope.problems = index;
ProblemsLoader.loadProblem("tsp", problemId, function(problem) {
$scope.problem = problem
});
} else {
var firstProblemId = index[0].fileName;
$location.path("/tsp/" + firstProblemId)
}
});
})
.controller("VrpController", function($scope, $rootScope, $http, $routeParams, ProblemsLoader) {
$scope.problemType = "vrp";
var problemId = $routeParams.problemId;
ProblemsLoader.loadIndex("vrp", function(index) {
if (problemId) {
$scope.problems = index;
ProblemsLoader.loadProblem("vrp", problemId, function(problem) {
$scope.problem = problem
});
} else {
var firstProblemId = index[0].fileName;
$location.path("/vrp/" + firstProblemId)
}
});
});
实际上,服务是这个用例的一个很好的解决方案,注入$scope是没有必要的 当服务公开对象属性时,会在其上设置隐式监视,因此状态更改会透明地传播 服务:
var problemSvc = function($http) {
var problemData = {
problemId: 1,
problemField: '',
otherProblemField: ''
};
return {
problem: problemData, // exposing the data as object
loadProblem: function(problemId) {
// load logic here
problemData.problemField = 'load data here';
problemdata.otherProblemField = 'more data from server or whatever';
}
}
}
angular.service('problemSvc', ['$http', problemSvc]);
1-N消费控制器:
angular.controller('ctrl', ['$scope', 'problemSvc', function($scope, problemSvc) {
$scope.problem = problemSvc.problem;
}]);
当问题服务中的字段发生更改时,注入服务的任何控制器都将自动更新
<div>{{problem.problemField}}</div>
{{problem.problemField}
实际上,服务是这个用例的一个很好的解决方案,注入$scope是没有必要的
当服务公开对象属性时,会在其上设置隐式监视,因此状态更改会透明地传播
服务:
var problemSvc = function($http) {
var problemData = {
problemId: 1,
problemField: '',
otherProblemField: ''
};
return {
problem: problemData, // exposing the data as object
loadProblem: function(problemId) {
// load logic here
problemData.problemField = 'load data here';
problemdata.otherProblemField = 'more data from server or whatever';
}
}
}
angular.service('problemSvc', ['$http', problemSvc]);
1-N消费控制器:
angular.controller('ctrl', ['$scope', 'problemSvc', function($scope, problemSvc) {
$scope.problem = problemSvc.problem;
}]);
当问题服务中的字段发生更改时,注入服务的任何控制器都将自动更新
<div>{{problem.problemField}}</div>
{{problem.problemField}
您是否考虑过为控制器使用javascript类模式?您可以为这些设置一个“基类”,然后将要加载的索引设置为“构造函数”或某个回调?将控制器转换为指令,这样,您就可以将problemType
转换为一个HTML属性,从而获得类似
和
的内容。您考虑过为控制器使用javascript类模式吗?您可以为这些设置一个“基类”,然后在“构造函数”或某个回调中设置要加载的索引?将控制器转换为指令,这样您就可以将problemType
转换为HTML属性,从而获得类似
和