角度控制器作为vm继承

时间:2015-02-18 16:28:16

标签: javascript angularjs inheritance

我想使用vm convention控制器编写。问题是我面临的是继承,例如假设我有以下内容:

基本控制器:

  angular.module('app')
    .controller('BaseCtrl', BaseCtrl);

  function BaseCtrl() {
    var vm = this;
    vm._privateVar = 1;
  }

  BaseCtrl.prototype.foo= function() {
    console.log('foo')
  };

儿童控制器:

  angular.module('app')
    .controller('ChildCtrl', ChildCtrl);

  function ChildCtrl() {
    var vm = this;
  }

  ChildCtrl.prototype.goo= function() {
    console.log('goo')
  };

注意:
我只能在ChildCtrl函数中访问注入:

function ChildCtrl(/*I can inject here only*/) {
    var vm = this;
} 

此外,BaseCtrl不是全局类/函数/对象。 在控制器功能之外注入控制器服务是否有任何意义?

我应该如何ChildCtrl继承BaseCtrl形式? 谢谢!

2 个答案:

答案 0 :(得分:1)

最终我做了以下,

  //get the injector.
  var injector = angular.injector(['app']);

  //get the service.
  var $controller = injector.get('$controller');
  var BaseCtrl = $controller('BaseCtrl');

  angular.module('app')
    .controller('ChildCtrl', ChildCtrl);

  function ChildCtrl() {
     var vm = this;
     BaseCtrl.call(this);
  }

  ChildCtrl.prototype = Object.create(BaseCtrl);

正如您所看到的,我已经注入了$controller服务,并使用了BaseCtrl。

我知道这很丑陋,我很乐意听到更好的建议;

答案 1 :(得分:0)

您可以在子控制器中执行以下操作:

function ChildCtrl() {
  var vm = this;
  BaseCtrl.call(this);
}

ChildCtrl.prototype = Object.create(BaseCtrl);

使用这种方法,BaseCtrl需要是全局的。您可以使用mixin获得类似的代码重用,并且它不会使用全局但您不会从基础原型中获得任何东西。 e.g:

var BaseCtrlMixinService = function() {
  this.myValue = 123;
  this.myFunc = function() {
    console.log(this.myValue);
  }
}

angular.module('app').service('baseCtrlMixin', BaseCtrlMixinService);


function ChildCtrl(baseCtrlMixin) {
  var vm = this;
  angular.extend(this, baseCtrlMixin);
}

angular.module('app').controller('ChildCtrl', ChildCtrl);
相关问题