Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 工厂函数的依赖注入(AngularJS)_Javascript_Angularjs_Dependency Injection_Angularjs Factory - Fatal编程技术网

Javascript 工厂函数的依赖注入(AngularJS)

Javascript 工厂函数的依赖注入(AngularJS),javascript,angularjs,dependency-injection,angularjs-factory,Javascript,Angularjs,Dependency Injection,Angularjs Factory,我有一些在不同控制器中使用的功能,我不想将其复制并粘贴多次到控制器中,而是想将其拉出并放置在工厂中 但是,当我试图通过Angular{{expressions}}调用HTML中的函数时,它不起作用 相反,我在每个控制器的$scope中创建了调用工厂函数的函数,以便DOM可以读取表达式,但这似乎是多余的。有没有办法解决这个问题,这样我就可以简单地从工厂调用函数 以下是我最初尝试的: index.html: <div ng-controller="MyController"> T

我有一些在不同控制器中使用的功能,我不想将其复制并粘贴多次到控制器中,而是想将其拉出并放置在工厂中

但是,当我试图通过Angular
{{expressions}}
调用HTML中的函数时,它不起作用

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

以下是我最初尝试的:

index.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>
controllers.controller('MyController', ['$scope', 'MakeGraph', '$routeParams', function($scope, MakeGraph, $routeParams){
    $scope.whichItem = $routeParams.itemId;
    //no other reference to MakeGraph here
}])
app.factory('MakeGraph', function(){
    var service = {};

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

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

    return service;

});
factory.js

<div ng-controller="MyController">
    The rating of this item is: {{MakeGraph.getRating(whichItem)}}<br />
    The votes of this item is: {{MakeGraph.getVotes(whichItem)}}
</div>
controllers.controller('MyController', ['$scope', 'MakeGraph', '$routeParams', function($scope, MakeGraph, $routeParams){
    $scope.whichItem = $routeParams.itemId;
    //no other reference to MakeGraph here
}])
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内调用函数了吗?谢谢。

向控制器添加
$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>
点击我
请注意,如果您在服务中返回承诺,您可能仍然需要将其包装到控制器中,以便正确处理
.success/.then/.error…
事件

,因此,DOM只能访问控制器中的$scope变量,即使某些内容已传递到控制器中(但没有在$scope上特别标记)?谢谢!一个快速的方法是角度。扩展($scope,MyService)