【问题标题】:How to get rid of code duplication in Angular controllers?如何摆脱 Angular 控制器中的代码重复?
【发布时间】:2014-03-09 18:34:39
【问题描述】:

我有两个控制器,它们执行非常相似的任务。

删除代码重复的适当方法是什么?

最初我尝试将创建模板方法移动为角度服务,但看起来我无法将 $scope 注入服务。

.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)
        }
    });
});

【问题讨论】:

  • 您是否考虑过为您的控制器使用 javascript 类模式?您可以为这些创建一个“基类”,然后将索引设置为在“构造函数”或某个回调中加载?
  • 把你的控制器变成一个指令,这样你就可以把problemType变成一个HTML属性,引导你到<div my-directive my-problem-type="tsp"/><div my-directive my-problem-type="vrp"/>这样的东西

标签: javascript angularjs refactoring code-duplication


【解决方案1】:

实际上,服务是这个用例的一个很好的解决方案,注入 $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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2018-03-04
    • 2023-03-31
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多