从控制器将参数传递给Angular Factory

时间:2015-10-15 05:58:15

标签: javascript angularjs mvvm

我无法将参数从角度控制器传递到工厂。谁可以帮我这个事?它可以在不传递参数的情况下工作,但是当我通过它时它不是。

var app = angular.module('employee', ['ui.grid', 'ui.grid.saveState', 'ui.grid.selection', 'ui.grid.cellNav', 'ui.grid.resizeColumns', 'ui.grid.moveColumns', 'ui.grid.pinning', 'ui.bootstrap', 'ui.grid.autoResize','ui.grid.pagination']);

app.controller('EmpCtrl', ['$scope', '$http', '$interval', '$modal', '$log', 'gridService', function ($scope, $http, $interval, $modal, $log, gridService) {
    $scope.LoadNextPage = gridService.LoadNextPage("5");
}]);

var gridService = function ($http, $rootScope) {
    return {
        LoadNextPage: function (hh) {
            alert(hh);
        },
        gridOptions:gridOptions
    };
};

app.factory('gridService', ['$http', '$rootScope', gridService]);

这就是我在视图中使用它的方式

<span id="pcNext"
      class="glyphicon glyphicon-step-forward"
      ng-click="LoadNextPage()">
</span>

3 个答案:

答案 0 :(得分:3)

问题出在您的控制器中:

$scope.LoadNextPage = gridService.LoadNextPage("5");

这意味着您的LoadNextPage 不是功能,而是您服务中的某项功能调用的结果。哪个btw没有返回任何东西,而只是显示警报。但在您看来,您正在使用LoadNextPage作为函数调用...

将其更改为此,以便您的控制器LoadNextPage成为您可以从视图中调用的功能。

$scope.LoadNextPage = gridService.LoadNextPage;

并在您看来:

<span id="pcNext"
      class="glyphicon glyphicon-step-forward"
      ng-click="LoadNextPage(5)">
</span>

这应该有用。

  

注意 :我怀疑您的gridOptions是在您在问题中提供的代码范围之外的某处定义的,因此它不会由于丢失(可能)对象而引发错误。所以我认为这是代码中的拼写错误而不是实际问题。

在你看来不想要参数?

没问题。您可以创建包装函数或将其绑定到代码中的特定参数:

// wrap
$scope.LoadNextPage = function() {
    return gridService.LoadNextPage("5");
};

// bind
$scope.LoadNextPage = gridService.LoadNextPage.bind(this, 5);

烘焙您服务中的号码......

答案 1 :(得分:0)

此处的问题是gridOptions:gridOptions未定义哪个引发错误。 从,gridOptions:gridOptions移除factory

检查代码段是否有工作代码,并与您的代码进行比较。

var app = angular.module('employee', []);
app.controller('EmpCtrl', ['$scope', 'gridService', function ($scope, gridService) {
 $scope.clickMe = function() {
   $scope.LoadNextPage = gridService.LoadNextPage("5");
 }
}]);
var gridService = function() {
  return {
    LoadNextPage: function (hh) {
     alert(hh);
   }
 };
};
app.factory('gridService', ['$http', '$rootScope', gridService]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="employee" ng-controller="EmpCtrl">
  <button ng-click="clickMe()">Button</button>
</div>

答案 2 :(得分:0)

您未定义 gridOptions 功能,请参阅此链接:

angular.module("myApp", []).controller("myCon", function($scope, $interval, gridService){

  $scope.LoadNextPage = gridService.LoadNextPage("5");
}).factory('gridService', ['$http', '$rootScope', gridService]);

function gridService($http, $rootScope){
  return {
        LoadNextPage: function (hh) {
            alert(hh);
        }
    };
}

see this link