1

我有一些功能在不同的控制器中使用,而不是多次复制粘贴到控制器中,我想把它拉出来放在工厂里。

但是,当我尝试通过 Angular 在 HTML 中调用该函数时,{{expressions}}它不起作用。

相反,我在每个控制器的 $scope 中创建了调用工厂函数的函数,以便 DOM 可以读取表达式——但这似乎是多余的。有没有办法解决这个问题,所以我可以简单地从工厂调用函数?

这是我最初尝试过的:

索引.html

<div ng-controller="MyController">
    The rating of this item is: {{MakeGraph.getRating(whichItem)}}<br />
    The votes of this item is: {{MakeGraph.getVotes(whichItem)}}
</div>

MyController.js

controllers.controller('MyController', ['$scope', 'MakeGraph', '$routeParams', function($scope, MakeGraph, $routeParams){
    $scope.whichItem = $routeParams.itemId;
    //no other reference to MakeGraph here
}])

工厂.js

app.factory('MakeGraph', function(){
    var service = {};

    service.getRating = function(itemNo){
        ...
        return ...;
    };

    service.getVotes = function(itemNo){
        ...
        return ...;
    };

    return service;

});

相反,只有当我将 MyController 更改为以下内容时,我才能让它工作:

$scope.getRating = function(){
    return MakeGraph.getRating(itemNo);
};

我可以解决这个问题,这样我就不必在 $scope 内调用函数了吗?谢谢。

4

1 回答 1

3

添加$scope.MakeGraph = MakeGraph到您的控制器

controllers.controller('MyController', ['$scope', 'MakeGraph', '$routeParams', function($scope, MakeGraph, $routeParams){
    $scope.whichItem = $routeParams.itemId;
    $scope.MakeGraph = MakeGraph
}])

然后您可以MakeGraph从您的视图中访问

例子:

<a ng-click="MakeGraph.getVotes(12)"> Click me </a>

请注意,如果您在服务中返回承诺,您可能仍需要将 then 包装在控制器中以便正确处理.success / .then / .error ...事件

于 2014-06-27T14:05:22.150 回答