GVKun编程网logo

如何用angularjs中的2个相同控制器制作原型?(angularjs controller)

15

想了解如何用angularjs中的2个相同控制器制作原型?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于angularjscontroller的相关问题,此外,我们还将为您介绍关于angu

想了解如何用angularjs中的2个相同控制器制作原型?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于angularjs controller的相关问题,此外,我们还将为您介绍关于angularjs – Angular ui.router,从子控制器调用父控制器函数?、angularjs – 使用angular.module()创建的角度控制器 controller()、angularjs – 使用Karma和Jasmine测试Angular JS中的父控制器范围变量、angularjs – 使用相同服务并获得相同结果的两个不同控制器的新知识。

本文目录一览:

如何用angularjs中的2个相同控制器制作原型?(angularjs controller)

如何用angularjs中的2个相同控制器制作原型?(angularjs controller)

在我的应用程序中,我有两个几乎相同的控制很多功能都是一样的,所以我想把它们原型化.这是控制器#1:

c2gcontroller.js

angular.module('c2gyoApp')
  .controller('C2gCtrl',function($scope) {
    // some unique stuff
    $scope.Feeday = 59;
    ...
    // the identical functions
    $scope.getMinutes = function(minutes) {
      var duration = moment.duration(minutes,'m');
      return duration.minutes();
    };
    ...
  });

和控制器#2:

c2gbcontroller.js

angular.module('c2gyoApp')
  .controller('C2gbCtrl',function($scope) {
    // some unique stuff
    $scope.Feeday = 89;
    ...
    // the identical functions
    $scope.getMinutes = function(minutes) {
      var duration = moment.duration(minutes,'m');
      return duration.minutes();
    };
    ...
  });

我已经尝试将$scope.getMinutes放入工厂:

smfactory.js

angular.module('c2gyoApp')
  .factory('smfactory',function() {
    return {
      getHours: function(minutes) {
        var duration = moment.duration(minutes,'m');
        return Math.ceil(duration.asHours() % 24);
      }
    };
  });

我已经将smfactory注入c2gcontroller.js

c2gcontroller.js(尝试#1)

angular.module('c2gyoApp')
  .controller('C2gCtrl',function($scope,smfactory) {
    ...
    // the identical functions
    $scope.getHours = smfactory.getHours(minutes);
    ...
  });

这会产生一个错误,即未定义分钟

line 33  col 42  'minutes' is not defined.

所以我尝试过:

c2gcontroller.js(尝试#2)

angular.module('c2gyoApp')
  .controller('C2gCtrl',smfactory) {
    ...
    // the identical functions
    $scope.getMinutes = function(minutes) {
      return smfactory.getHours(minutes);
    };
    ...
  });

这不会产生错误,但我的应用程序确实没有响应.基本上$scope.getMinutes现在不返回任何内容.

我已经阅读并观看了很多关于AngularJS服务,工厂,供应商的信息,但我不知道从哪里开始.原型c2gcontroller.js和c2gbcontroller.js的正确方法是什么?

解决方法

如何使用 angular.extend进行伪继承

/* define a "base" controller with shared functionality */
.controller('baseCtrl',['$scope',.. 
    function($scope,...) {

  $scope.getMinutes = function(minutes) {
    var duration = moment.duration(minutes,'m');
    return duration.minutes();
  };


.controller('C2gCtrl',['$controller','$scope',...
    function($controller,$scope,...) {

  // copies the functionality from baseCtrl to this controller
  angular.extend(this,$controller('baseCtrl',{$scope: $scope}));

  // some unique stuff
  $scope.Feeday = 59;

})

.controller('C2gbCtrl',{$scope: $scope}))

  // some unique stuff
  $scope.Feeday = 89;
})

angularjs – Angular ui.router,从子控制器调用父控制器函数?

angularjs – Angular ui.router,从子控制器调用父控制器函数?

我使用Angular与ui.router并设置了嵌套视图.父视图有一个div,其可见性可以通过父控制器上的函数切换.我想从嵌套视图的子控制器调用此函数.我该怎么做?
http://plnkr.co/edit/zw5WJVhr7OKqACoJhDZw?p=preview

JS

// Code goes here

angular.module("myApp",[]).controller("parent",function($scope){
  $scope.parentFunction = function(){
    alert("Called a function on the parent")
  }  
}).controller("child",function($scope){
  $scope.childFunction = function(){
    alert("Called a function on the child")
  }

  $scope.parentFromChild = function(){
    alert("I kNow this feels weird");
    $scope.parentFunction();
  }
})

HTML

<!DOCTYPE html>
<html>

  <head>
    <script data-require="angular.js@*" data-semver="1.2.14" src="http://code.angularjs.org/1.2.14/angular.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>

  <body ng-app="myApp">
    <div ng-controller="parent">
      <div ng-controller="child">
        <a href="#" ng-click="parentFunction()">Call Parent</a>
        <a href="#" ng-click="childFunction()">Call Child</a>
        <a href="#" ng-click="parentFromChild()">Call Parent from Child</a>
      </div>
    </div>
  </body>

</html>

控制器上的范围是原型继承的,我相信这意味着如果您不重新定义范围上的函数,从父范围获得相同的函数(如果您调用它)(问题是这样做就假定使用的上下文的控制器,虽然这是有争议的,如果这真的是一个问题,假设你不依赖于该控制器中的某些效果).

angularjs – 使用angular.module()创建的角度控制器 controller()

angularjs – 使用angular.module()创建的角度控制器 controller()

我还是很新的Angular.js和我的工作通过设置我的第一个应用程序。我想能够做到以下几点:
angular.module('App.controllers',[])
  .controller('home',function () {
    $scope.property = true;
  }]);

angular.module('App',['App.controllers'])
  .config(['$routeProvider',function($routeProvider) {
    $routeProvider.when('/',{templateUrl: 'partials/home.html',controller: home});
  }]);

使用此设置生成以下错误:

Uncaught ReferenceError: home is not defined from App

我的问题是:如何注册控制器使用angular.module.controller()(或$ controllerProvider.register()直接)和使用注册控制器在我的应用程序的其他地方。

我的动机:我想避免使用全局构造函数作为我的控制器(如angularjs.org使用的大多数例子)或复杂的命名空间。如果我可以注册和使用控制器作为单个变量名称(那不是放在全局范围),这将是理想的。

尝试使用字符串标识符。

routeProvider.when(‘/’,{templateUrl:’partials / home.html’,controller:’home’});

当你使用文字,它正在寻找一个变量home,但在这种情况下不存在。

angularjs – 使用Karma和Jasmine测试Angular JS中的父控制器范围变量

angularjs – 使用Karma和Jasmine测试Angular JS中的父控制器范围变量

我在页面上有两个控制器.它们被“包裹”在 HTML标记上,其中一个是“父”,另一个是“子”,如下所示:
<div id="parent" ng-controller="parentController">
    <div id="child" ng-controller=childController">
    </div>
</div>

在我的控制器的JS文件中,我从“子”控制器中的“父”控制器引用一个对象.

家长控制器:

angular.module('myApp').controller('parentController',function($scope){
    $scope.myReferencedobject = {};
    $scope.myReferencedobject.someProperty = "hello world";
});

儿童控制器:

angular.module('myApp').controller('childController',function($scope){
    $scope.childControllerVariable = $scope.myReferencedobject.someProperty;
});

因为“子”控制器嵌套在“父”控制器中,所以来自父控制器的对象在子控制器中继承.

这在Karma测试中不起作用,因为所有文件都被分解为单独的单元并单独测试.在进行单元测试时,$scope.myReferencedobject.someProperty引用在我的“子”控制器中是未定义的,因为没有原型继承.

我如何在Karma中解决这个问题?

您可以在测试内部控制器时将$scope初始化为您想要的任何内容,这样您就可以模拟父控制器在其上设置的内容
var controllerInstance;
beforeEach(inject(function ($controller,$rootScope) {
    scope = $rootScope.$new();
    scope.myReferencedobject = {someProperty: 'hello world'}
    controllerInstance = $controller('childController',{
      $scope: scope
    });
}));

angularjs – 使用相同服务并获得相同结果的两个不同控制器

angularjs – 使用相同服务并获得相同结果的两个不同控制器

我为我的所有主模块创建了两个常用服务.一个使用ng-resource.

app.service('CRUDService',function($resource,$window){
    var data = JSON.parse($window.localStorage["userInfo"]);
    this.crudFunction = function (url) {
        return $resource(url,{id:'@_id'},{
            update: {
                method: 'POST',headers: {
                    'Content-Type': 'application/x-www-form-urlencoded','Accept' : 'application/json','Authorization' : 'Bearer '+data['accesstoken']
                }
            },save: {
                method: 'POST',remove: {
                method: 'POST',get :{
                method: 'GET','Authorization' : 'Bearer '+data['accesstoken']
                }
            }
        });
    }
});

以及所有控制器使用的常用功能的另一项服务.

app.service('commonService',function (CRUDService) {
    var vm = this;
    var resourceUrl = apiUrl;
    vm.totalItemstemp = {};
    vm.totalItems = 0;
    vm.currentPage = 1;

    vm.pageChanged = function(newPage) {
        getResultsPage(newPage);
    };  

    vm.load = function(url) {
        resourceUrl = url;
        getResultsPage(1);
    }

    function getResultsPage(pageNumber) {
        CRUDService.crudFunction(resourceUrl).get({"page": pageNumber},function success(response) {
                vm.listdata = response["data"];
                vm.totalItems = response.total;
                vm.currentPage = pageNumber;
            },function error(response) {
                console.log(response);
            });
    }

    vm.save = function() {
        CRUDService.crudFunction(resourceUrl).save($.param(vm.newEntry),function(response) {
            if(response["success"] == true)
            {               
                vm.listdata.push(response["inserted_data"]);
                getResultsPage(vm.currentPage);
                $(".modal").modal('hide');
            }
            else
                vm.msg = "Error Saving";

        },function(response) {
            vm.error = response['data'];
        });
    }

    vm.create = function(){
        vm.newEntry = {};
        vm.editData = 0;
        vm.error = {};
    }

    vm.edit = function(id,index) {
        vm.newEntry = angular.copy(vm.listdata[index]);
        vm.editData = 1;
        vm.edit_index = index;
        vm.error = {};
    }

    vm.update = function(id,index) {
        vm.newEntry._method = "PUT";
        CRUDService.crudFunction(resourceUrl).update({id : id},$.param(vm.newEntry),function(response) {
            if(response["success"] == true)
            {
                vm.listdata[index] = response["updated_data"];
                $(".modal").modal('hide');
                vm.newEntry = {};
            }
            else
                vm.msg = "Error Updating";

        },function(response) {
            vm.error = response['data'];
        });
    }

    vm.remove = function(id,index) {
        var result = confirm("Are you sure you want to delete vm?");
        if (result) {
            CRUDService.crudFunction(resourceUrl).remove({id : id},$.param({"_method" : "DELETE"}),function(response) {
                getResultsPage(vm.currentPage);
            },function(response) {
                console.log(response);
            });
        }
    }
});

我正在我的控制器中注入commonService,如下所示:

app.controller('UserRolesCtrl',function($scope,commonService) {
    commonService.load(apiUrl + 'roles/:id');
    $scope.userroles = commonService;
});

app.controller('SupportMembersCtrl',commonService) {
    commonService.load(apiUrl + 'supportmembers/:id');
    $scope.supportmembers = commonService;
});

现在我正在为每个模块使用制表符.这样我的所有控制器都会在同一页面上.但所有标签显示相同的数据.是因为两个控制器都使用相同的变量名称吗?但是控制器的参考都是不同的.

解决方法

Is it because both controllers are using same variable names?

不可以.每个控制器都有自己的范围,因此您可以创建具有相同名称的变量

But both the controller’s references are different.

该服务就像单身,你做2个电话:

> commonService.load(apiUrl’supportmembers /:id’);
> commonService.load(apiUrl’colces /:id’);

第一个问题在于方法:运行

你重写resourceUrl两次

vm.load = function(url) {
    resourceUrl = url;  // <-- here 
    getResultsPage(1);
}

第二个问题 – 您将结果存储在服务中的相同变量下

vm.listdata = response["data"];
 vm.totalItems = response.total;
 vm.currentPage = pageNumber;

解决方案之一是将数据存储在唯一键下的地图中,在您的情况下,您可以获取您的URL.就像是:

vm.load = function(url) {
    //resourceUrl = url;
    getResultsPage(1,url); // pass url as argument
}

function getResultsPage(pageNumber,url) {
    CRUDService.crudFunction(url).get({"page": pageNumber},function success(response) {
            // ...
        },function error(response) {
            console.log(response);
        });
}

关于如何用angularjs中的2个相同控制器制作原型?angularjs controller的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于angularjs – Angular ui.router,从子控制器调用父控制器函数?、angularjs – 使用angular.module()创建的角度控制器 controller()、angularjs – 使用Karma和Jasmine测试Angular JS中的父控制器范围变量、angularjs – 使用相同服务并获得相同结果的两个不同控制器的相关知识,请在本站寻找。

本文标签: