DRYing控制器与指令与服务

时间:2015-05-31 21:36:33

标签: angularjs

我正在构建的应用程序有多个视图,每个视图都有自己的控制器。我的所有控制器都以相同的方式启动,并且在一种方法中有所不同;

$scope.a = ...              // same for all controllers
$scope.b = ...              // same for all controllers
$scope.c = function(){...}  // same for all controllers

$scope.d = function(){...}  // is different for each controller

他们说保持你的控制器很薄,并用服务将它们分解。 但是如果我把a,b,c放在一个服务中,它们将在所有控制器之间共享,我希望每个控制器在自己的范围内保留自己的a,b,c。 我不是在尝试共享数据,只是代码。

所以我创建了一个引用父作用域的指令,并在自己的控制器中声明了常见的东西。它解决了我的问题,但是你可以推荐一个最好的做法吗?

1 个答案:

答案 0 :(得分:3)

如果将控制器方法定义为范围属性,则可以使用简单的mixin方法使用常用方法扩展每个范围对象。

假设您使用可重用方法定义对象:

var mixin = {
    a: function() { return this.name; },
    b: function() {},
    c: function() {}
};

然后当您需要这些方法时,只需将它们混合到当前$scope

app.controller('Controller1', function($scope) {

    $scope.name = 'One';

    // Create common methods
    angular.extend($scope, mixin);

    // Define unique method
    $scope.d = function() {};
});

内部mixin方法this将指向单个$scope对象。

以下是该方法的演示。

演示: http://plnkr.co/edit/Vc00GsRTi5d6VNcILsva?p=preview