1

我有幾個功能在不同的控制器中使用,而不是複製並粘貼多次到控制器,我想把它拉出並放在工廠。依賴注入功能與工廠(AngularJS)

但是,當我嘗試通過Angular {{expressions}}調用HTML中的函數時,它不起作用。

相反,我在每個控制器的$範圍內調用了工廠函數,所以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> 

MyController.js

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

factory.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); 
}; 

我能解決這個問題,所以我不必調用$範圍內的功能?謝謝。

+0

一個快速的方法是angular.extend($ scope,MyService) – Whisher

回答

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> 

請注意,如果你在你的服務回報承諾,你大概會仍然需要在您的控制器中包裝,以便正確處理.success/.then/.error ...事件

+0

那麼,只有DOM **才能訪問控制器內的$ scope變量,即使有東西傳入控制器(但沒有特別標記$範圍)? 謝謝! – user2494584