2015-06-04 65 views
3

我有一個工廠,需要從視圖調用工廠。 我想用兩個參數調用工廠。 是否可以從模板發送$ scope?

因爲我在多個地方使用同一工廠。

<input name="accnum" ng-blur="myservice.getAccountDetailsToDisplay($scope, accno)" /> 

控制器,

$scope.myservice= getAllDetailsService; 

在服務,

tellerApp.factory('getAllDetailsService',['$rootScope', '$resource', '$http', '$filter', '$window', function ($rootScope, $resource, $http, $filter, $window) { 
    return{ 
      getAccountDetailsToDisplay: function ($scope, accountnumber) { 
      console.log('>>>>>>'); 
      } 
};  
}]); 

回答

2

服務應該是直接取決於scope,它們可以是 間接依賴於彼此。如果您將$ scope傳遞給該服務,它將與該特定控制器緊密結合。

就像你的情況一樣,你只能通過accountnumber,那麼服務將進行一個必要的操作,如做一個ajax調用或從某處獲取數據。

tellerApp.factory('getAllDetailsService', ['$rootScope', '$resource', '$filter', '$window', function($rootScope, $resource, $http, $filter, $window) { 
    return { 
     getAccountDetailsToDisplay: function(accountnumber) { 
      return $http.get('/getAccountDetails?accountnumber=' + accountnumber).then(function(res) { 
       //here you could do your addtional operation on data. 
       return res.data; //giving access to data 
      }); 
     } 
    }; 
}]); 

控制器

$scope.myservice= getAllDetailsService 
//this line will ensure updation in scope 
$scope.myservice.accountDetailsToDisplay = getAllDetailsService.accountDetailsToDisplay; 

標記

<input name="accnum" ng-blur="myservice.getAccountDetailsToDisplay(accno)"/> 

同樣地,在上述C我沒有使用$scope作爲參數,服務方法只會返回從服務中獲取的任何數據,而使用服務方法的任何人只能通過服務獲得數據返回。從服務控制器獲取數據後,在其自己的上下文中修改範圍。

+0

我可以從控制器發送$範圍,但有沒有辦法從模板? – vishnu

+0

@vishnu我正在更新答案..什麼是正確的方式做它..通過$範圍到服務使您的代碼緊密夫婦 –

+1

@vishnu是的,你可以傳遞範圍對象從模板,但我不會推薦它。這是答案提供更好的方法。 – dfsq

0

當然,$ scope是控制器的內部上下文,所以你不需要在任何其他地方使用它。 如果你想使用的工廠,你應該這樣寫:

tellerApp.factory('getAllDetailsService',['$rootScope', '$resource', '$http', '$filter', '$window', function ($rootScope, $resource, $http, $filter, $window) { 
    return{ 
      getAccountDetailsToDisplay: function (accountnumber) { 
      console.log('>>>>>>'); 
    } 
    };  
}]); 

,並在控制器中調用你的工廠的方法:

$scope.someMethod = getAllDetailsService.getAccountDetailsToDisplay; 

和您的看法: <input name="accnum" ng-blur="myservice.someMethod(accno)" />