2014-05-05 71 views
1

我写了一个应用程序,它是多个项目的骨架。所以我编写了用我的模板中最小变量和回调填充范围的控制器。多个项目将使用此代码库并通过扩展我的控制器和我的模板来创建他们自己的应用程序。他们希望在某些控制器中向范围添加新的变量或新的回调。我需要找到一个简单的方法让他们在不改变我的模块的情况下做到这一点。可扩展角度控制器

所以我们可以说我有一个非常简单的控制器:

angular.module('controller-a').controller('a', function($scope) { 
    $scope.foo = 'bar'; 
}); 

而这个控制器通过基本的路由进行访问,如:

$routeProvider. 
     when('/a', { 
      templateUrl: 'partials/a.html', 
      controller: 'a' 
     }). 

而且一个希望将新值添加到像范围$scope.baz = 'klux';)。如何执行该操作? 是否有可能更改a以避免重新定义路由或必须为此完全创建另一个控制器?

我不是在标准使用情况下我有一个控制器,其功能在同一个应用程序通过多个的需要。每个控制器将被覆盖一次或没有,就是这样。

最接近什么看我想要的是:

angular.module('controller-b', []).controller('b', function($scope) { 
    var original = $controller('a'); 
    original($scope); 
    $scope.foo = 'bar'; 
}); 

但后来我需要改变使用B的替代路由,有没有什么办法在地方更新?

+0

“扩展'a'控制器的内容而不更改代码”。那么,控制器的目的是什么? – Dalorzo

+0

初始控制器提供了常见的多个项目的一些基本功能,然后多个项目希望,而无需更改/复制的初始代码(在实践中多了很多代码)以自己的方式来改变范围 – jolivier

+0

@joliver即所谓的服务,工厂。关于这种类型的问题和解决方案,软件模式是明确的 – Dalorzo

回答

0

我找到了一种方法做什么,我需要通过重写应用程序和路由映射并限定了延伸原有一个像这样的新控制器:

var app = angular.module('app-ext', [ 'app', 'ngRoute']); 
app.config(function($routeProvider) { 
    $routeProvider. 
    when('/a', { 
     templateUrl: 'partials/a.html', 
     controller: 'b' 
    }); 
}); 
app.controller('b', ['$controller', '$scope', '$http', '$location', function($controller, $scope, $http, $location) { 
    // Apply original controller 
    $controller('a', {'$scope' : $scope}); 
    // Add own features here 
    $scope.foo = 'bar'; 
}]); 

就像我预计其中一期工程。

0

当你想添加新值多个控制器,你可以在所有这些,$watch更改有注入的服务。您的开发人员更改服务,但不更改控制器。我认为这是服务的重点。

angular.module('controller-a', ['whatever']).controller('a', function($scope, MyService) { 
    $scope.foo = 'bar'; 
    $scope.$watch(MyService.return_new_values(), 
    function(newValue, oldValue) { 
     // do somethign with the values? 
    }); 
}); 

angular.module('controller-b', ['whatever']).controller('b', function($scope, MyService) { 
    $scope.foo = 'bar'; 
    $scope.$watch(MyService.return_new_values(), 
    function(newValue, oldValue) { 
     // do somethign with the values? 
    }); 
}); 

angular.module('whatever').factory('MyService', function() { 

    var myService = {}; 

    myService.developer_x_var = 'klux'; 
    myService.developer_y_var = 'foo'; 

    myService.return_new_values = function() { 
     var array_of_new_values = [myService.developer_x_var, 
            myService.developer_y_var 
            ]; 
     return array_of_new_values; 
    } 

    return myService; 
}); 
+0

如何处理新值?公寓,如果我误解了这个逻辑不应该在它应该在扩展模块的基础。 – jolivier

+0

你对你的价值做什么取决于你的用例当然,所以这取决于你。只要你正确地获得你的依赖关系,哪个模块中的内容并不重要。这取决于你的应用程序的结构。 –

+0

我改写我的问题应该是清晰的,现在:我负责写模块的,和其他开发商会想,而能够改变模块扩展他们的模块B控制器,所以它不管是哪个模块中。所以我不认为你提供了解决这个问题的方法。 – jolivier