想了解如何用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 – Angular ui.router,从子控制器调用父控制器函数?
- angularjs – 使用angular.module()创建的角度控制器 controller()
- angularjs – 使用Karma和Jasmine测试Angular JS中的父控制器范围变量
- angularjs – 使用相同服务并获得相同结果的两个不同控制器
如何用angularjs中的2个相同控制器制作原型?(angularjs controller)
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的正确方法是什么?
解决方法
/* 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,从子控制器调用父控制器函数?
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()
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中的父控制器范围变量
<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中解决这个问题?
var controllerInstance; beforeEach(inject(function ($controller,$rootScope) { scope = $rootScope.$new(); scope.myReferencedobject = {someProperty: 'hello world'} controllerInstance = $controller('childController',{ $scope: scope }); }));
angularjs – 使用相同服务并获得相同结果的两个不同控制器
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 – 使用相同服务并获得相同结果的两个不同控制器的相关知识,请在本站寻找。
本文标签: