本文的目的是介绍javascript–AngularJs–如何用私有方法编写可测试的控制器的详细情况,我们将通过专业的研究、有关数据的分析等多种方式,同时也不会遗漏关于angular.js,javas
本文的目的是介绍javascript – AngularJs – 如何用私有方法编写可测试的控制器的详细情况,我们将通过专业的研究、有关数据的分析等多种方式,同时也不会遗漏关于angular.js,javascript中的多个控制器实例、AngularJS控制器如何使用?angularjs的控制器控制angularjs应用程序实例解析、javascript – Angular.js指令控制器继承、javascript – AngularJS Karma测试 – 测试时未定义传递给控制器的Resolve对象的知识。
本文目录一览:- javascript – AngularJs – 如何用私有方法编写可测试的控制器
- angular.js,javascript中的多个控制器实例
- AngularJS控制器如何使用?angularjs的控制器控制angularjs应用程序实例解析
- javascript – Angular.js指令控制器继承
- javascript – AngularJS Karma测试 – 测试时未定义传递给控制器的Resolve对象
javascript – AngularJs – 如何用私有方法编写可测试的控制器
假设我有一个控制器
angular.module('app').controller('MyCtrl',function() { this.myFunc = function() { // ... }; activate(); function activate() { this.myFunc(); } });
该控制器有一个名为activate()的函数,在创建控制器时调用该函数.
如何为activate()函数编写测试? (像这样:创建控制器时,应调用控制器函数“myFunc()”)
我试着写这样的东西:
describe('activate() controller',function() { it('should call function myFunc',inject(function($rootScope,$controller) { var locals = {$scope: $rootScope.$new()}; var controller = $controller('MyCtrl',locals); spyOn(controller,'myFunc').toHaveBeenCalled(); }); }
但我得到错误:
Expected spy myFunc to have been called.
我想在创建我的间谍时,控制器已经调用了激活功能.
有没有办法测试像这样的控制器?
解决方法
如果该方法是服务的一部分,您可以在注入中设置您的间谍,然后初始化控制器并期望调用服务方法.
angular.js,javascript中的多个控制器实例
我做什么(在 HTML中):
<div> <divng-controller="leftBoardController"> <div ng-controller="panelController" ng-include="template"></div> </div> <divng-controller="rightBoardController"> <div ng-controller="panelController" ng-include="template"></div> </div> </div>
我将所有初始化逻辑保留在左右控制器中,并使用panelController及其左右部分的视图.在这种情况下,可以共享panelController,因为它使用具有不同值的公共$scope变量(在左侧和右侧控制器中创建变量,因此它们对panelCotrl可见).
angular.module("radar.leftController",[]) .controller("leftController",function ($scope,...) { $scope.data = getSomeData(); } angular.module("radar.rightController",[]) .controller("rightController",...) { $scope.data = getotherData(); } angular.module("radar.panelController",[]) .controller("panelController",...) { $scope.template = "somePath/panelView.html"; // shared logic for left and right contrls goes here }
在panelView.html中:
<div>data: {{data.length}}</div>
似乎从右边我可以改变左右变速器,但是从左边我只能改变左变速器(如预期的那样). (我需要左右两部分完全分开).
那么,重用一个控制器(创建多个实例)的正确方法是什么?
解决方法
然后你的代码看起来像这样:
... angular.module("radar.panel",[]) .directive("panel",function() { return { scope: {'panelData': '=' // Doubly bound to panel-data attribute},templateUrl: 'somePath/panelView.html' controller: function ($scope,...) { // shared logic for left and right contrls goes here } } }
<div> <divng-controller="leftBoardController"> <div panel panel-data="data"></div> </div> <divng-controller="rightBoardController"> <div panel panel-data="data"></div> </div> </div>
AngularJS控制器如何使用?angularjs的控制器控制angularjs应用程序实例解析
本篇文章主要的介绍了关于angularjs的控制器的使用。angularjs控制器控制angularjs应用程序的数据。现在让我们一起来看看这篇文章吧
angularjs控制器的介绍:
angularjs 控制器 控制 angularjs 应用程序的数据。
AngularJS 控制器是常规的 JavaScript 对象。
AngularJS 控制器
AngularJS 应用程序被控制器控制。
ng-controller 指令定义了应用程序控制器。
控制器是 JavaScript 对象,由标准的 JavaScript 对象的构造函数 创建。
<p> 名: <input><br> 名: <input><br><br> 姓名: {{firstName + " " + lastName}} </p> <script> var app = angular.module('myApp', []); app.controller('myCtrl', function($scope) { $scope.firstName = "John"; $scope.lastName = "Doe"; }); </script>
应用解析:
AngularJS 应用程序由 ng-app 定义。应用程序在
内运行。
ng-controller="myCtrl" 属性是一个 AngularJS 指令。用于定义一个控制器。
myCtrl 函数是一个 JavaScript 函数。
AngularJS 使用$scope 对象来调用控制器。
在 AngularJS 中, $scope 是一个应用对象(属于应用变量和函数)。
控制器的 $scope (相当于作用域、控制范围)用来保存AngularJS Model(模型)的对象。
控制器在作用域中创建了两个属性 (firstName 和 lastName)。
ng-model 指令绑定输入域到控制器的属性(firstName 和 lastName)。(想看更多就到PHP中文网AngularJS开发手册栏目中学习)
控制器方法
上面的实例演示了一个带有 lastName 和 firstName 这两个属性的控制器对象。
控制器也可以有方法(变量和函数):
<p> 名: <input><br> 姓: <input><br><br> 姓名: {{fullName()}} </p> <script> var app = angular.module('myApp', []); app.controller('personCtrl', function($scope) { $scope.firstName = "John"; $scope.lastName = "Doe"; $scope.fullName = function() { return $scope.firstName + " " + $scope.lastName; } }); </script>
外部文件中的控制器
在大型的应用程序中,通常是把控制器存储在外部文件中。
只需要把 <script> 标签中的代码复制到名为 personController.js 的外部文件中即可:</script>
<p> First Name: <input><br> Last Name: <input><br><br> Full Name: {{firstName + " " + lastName}} </p> <script></script>
其他实例
以下实例创建一个新的控制器文件:
angular.module(''myApp'', []).controller(''namesCtrl'', function($scope) { $scope.names = [ {name:''Jani'',country:''Norway''}, {name:''Hege'',country:''Sweden''}, {name:''Kai'',country:''Denmark''} ]; });
保存文件为 namesController.js:
然后,在应用中使用控制器文件:
<p> </p>
- {{ x.name + '', '' + x.country }}
好了,本篇文章到这就结束了(想看更多就到PHP中文网AngularJS使用手册中学习),有问题的可以在下方留言提问。
以上就是AngularJS控制器如何使用?angularjs的控制器控制angularjs应用程序实例解析的详细内容,更多请关注php中文网其它相关文章!
javascript – Angular.js指令控制器继承
.directive('money',['Service',function (Service) { /* * Some code */ controller: ['$scope','$element','$attrs','$parse',function (scope,cElement,attrs,$parse) { scope.someValue=1; scope.someFunction = function(){ console.writeline('money'); } }
还有第二个指令:
.directive('cash',function (Service) { /* * Some code */ controller: ['$scope',$parse) { scope.someValue=1; scope.someFunction = function(){ console.writeline('cash'); } }
正如您所看到的,这两个指令之间的区别仅在于一个函数的内容.
如此完美的方式将继承someFunction的所有控制器和阴影
是否有可能在角度上制作这样的东西,或者我应该留下两个指令,如此小的差异?
解决方法
因此,而不是< div data-money>< / div>和< div data-cash>< / div>你有< div data-console text =“money”>< / div>和< div data-console text =“cash”>< / div>.
基本上,将不同的东西拉入可以带入更通用指令的属性中.
根据评论,这个怎么样?将控制器创建为独立函数,然后在两个指令中使用相同的控制器.
但是在这一点上,我不确定它会为你节省太多(或任何)代码,并且对于这种重构可能有点过分.考虑到微小的差异,让它保持原样可能更有意义.
javascript – AngularJS Karma测试 – 测试时未定义传递给控制器的Resolve对象
我将一个resolve对象作为参数注入我的控制器,然后在控制器中设置一个范围变量.它在应用程序上完美运行如下:
国家提供者
$stateProvider.state('myState',{ resolve:{ foo: function(){ return 'bar'; },url: '/',templateUrl: 'index.html',controller: 'FooCtrl' })
调节器
app.Controllers.controller('FooCtrl',['$scope','$state','foo',function ($scope,$state,$log,Zone,foo) { $scope.testvar = foo console.log($scope.testvar); }])
然后,按照预期在Chrome中将“条形图”记录到控制台.
但是当使用Karma运行测试时,解析对象现在是未定义的,这使测试失败.这是测试代码:
describe('controllers',function(){ var $rootScope,$scope,$state beforeEach(module('app')) beforeEach(inject(function($injector) { $state = $injector.get('$state') $rootScope = $injector.get('$rootScope') $scope = $rootScope.$new() $controller = $injector.get('$controller') })) it('FooCtrl should exist',inject( function() { $state.go('myState') $rootScope.$apply() $controller = $controller('FooCtrl',{ '$scope': $scope }) $rootScope.$apply() assert.equal($scope.testvar,"bar","these strings are equal") })) })
出现此错误(在我的情况下,resolve对象称为resolvedRouteModels):
[$injector:unpr] UnkNown provider: fooProvider <- foo http://errors.angularjs.org/1.3.0-build.2921+sha.02c0ed2/$injector/unpr?p0=fooProvider%20%3C-%20foo
任何帮助将不胜感激,如果您遇到此问题,请告诉我.
解决方法
解决此问题的一种方法是在测试中自己提供此依赖项,就像将范围传递给控制器一样:
var foo = 'bar'; // whatever $controller = $controller('FooCtrl',{$scope: $scope,foo: foo} );
注意,您还可以创建一个模拟$state对象,并以相同的方式将其传递给控制器,如果您想将其合并到测试中.
今天的关于javascript – AngularJs – 如何用私有方法编写可测试的控制器的分享已经结束,谢谢您的关注,如果想了解更多关于angular.js,javascript中的多个控制器实例、AngularJS控制器如何使用?angularjs的控制器控制angularjs应用程序实例解析、javascript – Angular.js指令控制器继承、javascript – AngularJS Karma测试 – 测试时未定义传递给控制器的Resolve对象的相关知识,请在本站进行查询。
本文标签: