AngularJS中controller控制器继承的使用方法

前端之家收集整理的这篇文章主要介绍了AngularJS中controller控制器继承的使用方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前沿

最近在angularjs项目当中,看到 controller 好多都是重复性的代码,在 controller 当中有好多代码很相似 function(比如 controller 下的 CRUD 方法),重复性工作太多。后来想,可不可以提出一个service ,但仔细想想,这些CRUD 本来就是从 Service 中调用的,如果在提出Service,会造成 Service 比较混乱,职责不清晰 。 因为自己做过一些后端,借助后端的思想,是不是可以 controller 继承。

controllerservice实现继承经过一番查阅资料,发现AngularJS已经帮我们提供了controller继承。我们只需借助 controllerservice 。$controller service api

函数 // 如果传入一个 string,就会根据字符串去$controllerProvider 找 注册的 controller //locals 是一个对象,注入来自局部的 controller,在这里我们认为 child controller $controller(constructor,locals,[bindings])

嵌套控制器中属性是如何被继承的?

==属性值是字符串

myApp.controller("ChildCtrl",function($scope){

})

<div ng-controller="ParentCtrl">

子控制器中的name变量值
 <ul>
  <li>child controller name: {{name}}</li>
  <li>parent controller name: {{$parent.name}}</li>
 </ul>

以上,ParentCtrl中的name字段被ChildCtrl分享,但改变ChildCtrl中的name字段值却不会影响ParentCtrl中的name值,当改变ChildCtrl中的name值,ParentCtrl和ChildCtrl的嵌套关系被打破,再次改变ParentCtrl中的name字段值也不会影响ChildCtrl中的name值。

以上,给ParentCtrl中的变量赋值是字符串类型,如果给ParentCtrl中的字段赋值对象类型呢?

==属性值是对象

myApp.controller("ChildCtrl",function($scope){

})

<div ng-controller="ParentCtrl">

子控制器中的vm.name变量值
 <ul>
  <li>child controller name: {{vm.name}}</li>
  <li>parent controller name: {{$parent.vm.name}}</li>
 </ul>

以上,ParentCtrl中vm对象的被ChildCtrl分享,当然也分享了对象中的name字段,当改变ChildCtrl中的vm.name值会影响到ParentCtrl,也就是不会把ParentCtrl和ChildCtrl之间的嵌套关系打破。

嵌套控制器中方法是如何被继承的?

$scope.add = function(name){
$scope.myArray.push(name);
}
})

myApp.controller("CollectionCtrl",function($scope){

})

<div ng-controller="ArrayCtrl">

{{myArray}}

使用ArrayCtrl中的add方法添加没问题;而且ArrayCtrl中的add方法也可以被CollctionCtrl使用;

而且在子控制器中可以重写父控制器中的方法

<div ng-controller="ArrayCtrl">

{{myArray}}

代码案例

1.创建一个 base.controller.js 文件

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

//手动注入一些服务
BaseCtrl.$inject = ['$scope','CRUDServices'];

/ @ngInject /
function BaseCtrl($scope,CRUDServices) {
var _this = this;
//当前 controller 提供一些方法
_this.bFormValid = formValid;

activate();

////////////////

//初始化时候<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>
function activate() {

  getList();
}

// <a href="https://www.jb51.cc/tag/huoqu/" target="_blank" class="keywords">获取</a>数据列表
function getList() {
  //把当前的结果赋值给 bList <a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a>上
  _this.bList = CRUDServices.getList();
}

// 表单验证
function formValid(){

  //do some thing
  return false;
}

}
})();

代码很简单,我们在 BaseController中提供了一个简单的 formValid() 方法,还初始化调用了一个getList() 方法

2.创建一个Service 。这个 service 来提供数据服务

angular
.module('DemoApp')
.service('ExtendServices',ExtendServices);

ExtendServices.$inject = [];

/ @ngInject /
function ExtendServices() {

return {
  getList: getList  //<a href="https://www.jb51.cc/tag/huoqu/" target="_blank" class="keywords">获取</a> list 列表
}

////////////////

function getList() {
  return [{ id: 1,name: '张三' },{ id: 2,name: '李四' }]
}

}
})();

3.创建child.controller.js 文件 也就是我们最主要的一个文件

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

//手动注入一些服务
//ExtendServices 用来提供数据的 Servie
ChildCtrl.$inject = ['$scope','$controller','ExtendServices'];

/ @ngInject /
function ChildCtrl($scope,$controller,ExtendServices) {

var vm = this;

//<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>我们父 controller 
var parentCtrl = $controller('BaseCtrl',{ $scope,$scope,CRUDServices:ExtendServices })

//通过 angular.extend 把父控制器上的 <a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>和<a href="https://www.jb51.cc/tag/shuxing/" target="_blank" class="keywords">属性</a> 绑定到 子的对象上
angular.extend(vm,parentCtrl);


activate();

////////////////

function activate() {

  //<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>表单验证<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>
  vm.bFormValid();      

}

}
})();

这样,我们通过 $controller service 实现了 controller 的继承 ,也可以把 child controller 需要的注入的服务 传入到 base controller 当中 。({ $scope,CRUDServices:ExtendServices }),我们child controlller 一行代码都没有写,就已经用了 获取 列表的 magic power 。如果我们需要调用表单验证,直接调用 vm.bFormValid() 就可以。

4.创建child.html 文件 ,我们直接 绑定就ok

结束语

这样下来以后我们可以提出一个 公共的 controller ,封装一些常用的方法,在 controller当中,只需要去写关于业务不同的 方法代码可维护性大大提高,代码量也会减下来。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

原文链接:https://www.f2er.com/js/35398.html
angularjscontroller继承控制器继承继承继承

猜你在找的JavaScript相关文章