AngularJS:使用调用(或应用)的控制器继承

AngularJS:使用调用(或应用)的控制器继承,angularjs,angularjs-controller,angularjs-factory,Angularjs,Angularjs Controller,Angularjs Factory,这是我在尝试使控制器更具可重用性时发现的 app.factory('BaseController', function(myService) { return function(variable) { this.variable = variable; this.method = function() { myService.doSomething(variable); }; }; }) .controller("ChildController1",

这是我在尝试使控制器更具可重用性时发现的

app.factory('BaseController', function(myService) {
  return function(variable) {
    this.variable = variable;
    this.method = function() {
      myService.doSomething(variable);
    };
  };
})

.controller("ChildController1", function($scope, BaseController) {
  BaseController.call($scope, "variable1");
})

.controller("ChildController2", function($scope, BaseController) {
  BaseController.call($scope, "variable2");
});
现在我可以在我的HTML中做类似的事情(例如在ng controller=“ChildController1”):ng click=“method()”


代码简单有效。但我不知道它到底是如何工作的(它是什么样的模式?),这样做是一种好的做法吗?

您的解决方案或多或少是这样工作的:

app.factory('mixinBaseController', function(myService) {
  return function (scope, variable) {
    angular.extend(scope, {
      variable: variable;
      method: function() {
        myService.doSomething(variable);
      }
    });
  };
})

.controller("ChildController1", function($scope, mixinBaseController) {
  mixinBaseController($scope, "variable1");
})

.controller("ChildController2", function($scope, mixinBaseController) {
  mixinBaseController($scope, "variable2");
});
你能看见吗?通过您的
.call($scope,…)
只是将上下文(
this
)设置为真实的
$scope
,这样
BaseController
就可以通过属性和函数扩展您的范围

这只是为了演示您的代码是如何工作的

要实现更类似JavaScript的继承,请参见:

您还应该看看AngularJS 1.2中介绍的。我强烈建议使用
controllerAs
。这也有助于实现控制器的继承