GVKun编程网logo

javascript – AngularJs – 如何用私有方法编写可测试的控制器

12

本文的目的是介绍javascript–AngularJs–如何用私有方法编写可测试的控制器的详细情况,我们将通过专业的研究、有关数据的分析等多种方式,同时也不会遗漏关于angular.js,javas

本文的目的是介绍javascript – AngularJs – 如何用私有方法编写可测试的控制器的详细情况,我们将通过专业的研究、有关数据的分析等多种方式,同时也不会遗漏关于angular.js,javascript中的多个控制器实例、AngularJS控制器如何使用?angularjs的控制器控制angularjs应用程序实例解析、javascript – Angular.js指令控制器继承、javascript – AngularJS Karma测试 – 测试时未定义传递给控制器的Resolve对象的知识。

本文目录一览:

javascript – AngularJs – 如何用私有方法编写可测试的控制器

javascript – AngularJs – 如何用私有方法编写可测试的控制器

我正在尝试使用angular.js jasmine为我的一个控制器编写测试.

假设我有一个控制器

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.

我想在创建我的间谍时,控制器已经调用了激活功能.

有没有办法测试像这样的控制器?

解决方法

上面的代码示例在初始化时执行myFunc方法.因此,当您附加间谍时,它已经被执行.更好的测试方法是检查myFunc执行的转换.

如果该方法是服务的一部分,您可以在注入中设置您的间谍,然后初始化控制器并期望调用服务方法.

angular.js,javascript中的多个控制器实例

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>

似乎从右边我可以改变左右变速器,但是从左边我只能改变左变速器(如预期的那样). (我需要左右两部分完全分开).

那么,重用一个控制器(创建多个实例)的正确方法是什么?

解决方法

正确的方法是使用 directives与隔离范围.
然后你的代码看起来像这样:

...
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控制器的介绍:

angularjs 控制器 控制 angularjs 应用程序的数据。

 AngularJS 控制器是常规的 JavaScript 对象

AngularJS 控制器

AngularJS 应用程序被控制器控制。

ng-controller 指令定义了应用程序控制器。

控制器是 JavaScript 对象,由标准的 JavaScript 对象的构造函数 创建。

<p>

名: <input><br>
名: <input><br><br>
姓名: {{firstName + " " + lastName}}

</p>

<script>
var app = angular.module(&#39;myApp&#39;, []);
app.controller(&#39;myCtrl&#39;, 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(模型)的对象。

控制器在作用域中创建了两个属性 (firstNamelastName)。

ng-model 指令绑定输入域到控制器的属性(firstName 和 lastName)。(想看更多就到PHP中文网AngularJS开发手册栏目中学习)

控制器方法

上面的实例演示了一个带有 lastName 和 firstName 这两个属性的控制器对象。

控制器也可以有方法(变量和函数):

<p>

名: <input><br>
姓: <input><br><br>
姓名: {{fullName()}}

</p>

<script>
var app = angular.module(&#39;myApp&#39;, []);
app.controller(&#39;personCtrl&#39;, 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 }}   
<script></script>

好了,本篇文章到这就结束了(想看更多就到PHP中文网AngularJS使用手册中学习),有问题的可以在下方留言提问。

以上就是AngularJS控制器如何使用?angularjs的控制器控制angularjs应用程序实例解析的详细内容,更多请关注php中文网其它相关文章!

javascript – Angular.js指令控制器继承

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对象

javascript – AngularJS Karma测试 – 测试时未定义传递给控制器的Resolve对象

我们正在使用ui-router 0.2.10.

我将一个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

任何帮助将不胜感激,如果您遇到此问题,请告诉我.

解决方法

当您实例化控制器时,Angular通常可以弄清楚如何满足控制器的依赖关系.在这种情况下,它不知道UI-Router的“解析”功能.

解决此问题的一种方法是在测试中自己提供此依赖项,就像将范围传递给控制器​​一样:

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对象的相关知识,请在本站进行查询。

本文标签: