Próbuję dołączyć do kontrolera bibliotekę funkcji przechowywanych w fabryce. podobne do pytań takich jak to: Creating common controller functions
Moja główny sterownik wygląda następująco:
recipeApp.controller('recipeController', function ($scope, groceryInterface, ...){
$scope.groceryList = [];
// ...etc...
/* trying to retrieve the functions here */
$scope.groceryFunc = groceryInterface; // would call ng-click="groceryFunc.addToList()" in main view
/* Also tried this:
$scope.addToList = groceryInterface.addToList();
$scope.clearList = groceryInterface.clearList();
$scope.add = groceryInterface.add();
$scope.addUp = groceryInterface.addUp(); */
}
Następnie w innym pliku .js, mam stworzył fabrykę groceryInterface. Wprowadziłem tę fabrykę do kontrolera powyżej.
Fabryka
recipeApp.factory('groceryInterface', function(){
var factory = {};
factory.addToList = function(recipe){
$scope.groceryList.push(recipe);
... etc....
}
factory.clearList = function() {
var last = $scope.prevIngredients.pop();
.... etc...
}
factory.add = function() {
$scope.ingredientsList[0].amount = $scope.ingredientsList[0].amount + 5;
}
factory.addUp = function(){
etc...
}
return factory;
});
Ale w moim konsoli Wciąż dostaję ReferenceError: $scope is not defined at Object.factory.addToList
itp Oczywiście zgaduję to ma wspólnego z tym, że używam $scope
w moich funkcji w fabryka. Jak rozwiązać ten problem? Zauważam, że w wielu innych przykładach, na które patrzyłem, nikt nie używa $scope
w swoich zewnętrznych funkcjach fabrycznych. Próbowałem wstrzykiwać $scope
jako parametr w mojej fabryce, ale to zwykłe wyjście nie działa. (np. recipeApp.factory('groceryInterface', function(){
)
Każda pomoc jest naprawdę doceniana!
Słodko, dziękuję. Spróbuję tego! – LazerSharks
@Gnuey - Zwróć uwagę, że 'bind' nie jest dostępny w starszych wersjach IE. Jeśli musisz je wspierać i chcesz użyć pierwszej metody, użyj [tego polifill MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind# Kompatybilność) lub - jeśli masz jQuery na stronie - użyj zamiast tego ['$ .proxy'] (http://api.jquery.com/jQuery.proxy/). –
Dobra, świetnie. To naprawdę bardzo pomocne informacje - mój szef dept i odwiedzający witrynę używają starszych wersji IE czasami z jakiegoś powodu: \ Czy zamiast tego napiszę '$ scope.addToList = $ .proxy (groceryInterface.addToList, $ scope)'? – LazerSharks