Ich versuche, eine Bibliothek von Funktionen, die in einer Fabrik gehalten werden, in einen Controller zu integrieren. Ähnlich Fragen wie diese: Creating common controller functions
Mein Hauptcontroller wie folgt aussieht:
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(); */
}
Dann habe ich die Fabrik groceryInterface erstellt, in einer anderen JS-Datei. Ich habe diese Fabrik in den Controller oben eingespritzt.
Fabrik
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;
});
Aber in meiner Konsole halte ich ReferenceError: $scope is not defined at Object.factory.addToList
bekommen usw. Offensichtlich in der ich vermute, dies mit der Tatsache zu tun hat, dass ich $scope
in meinen Funktionen bin mit Fabrik. Wie kann ich das beheben? Ich bemerke, dass in vielen anderen Beispielen, die ich angeschaut habe, niemand jemals $scope
innerhalb ihrer externen Fabrikfunktionen verwendet. Ich habe versucht, $scope
als Parameter in meiner Fabrik zu injizieren, aber diese Ebene hat nicht funktioniert. (z.B. recipeApp.factory('groceryInterface', function(){
)
Jede Hilfe wird wirklich geschätzt!
Süße, danke. Ich werde es ausprobieren! – LazerSharks
@Gnuey - Beachten Sie, dass 'bind' in älteren Versionen von IE nicht verfügbar ist. Wenn Sie diese unterstützen müssen und die erste Methode verwenden möchten, verwenden Sie entweder [diesen MDN-Polyfill] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind# Kompatibilität) oder - wenn Sie jQuery auf der Seite haben - verwenden Sie stattdessen ['$ .proxy'] (http://api.jquery.com/jQuery.proxy/). –
Okay, großartig. Das ist wirklich sehr hilfreiche Informationen - meine Deputy Head und Website-Besucher verwenden ältere IE-Versionen manchmal aus irgendeinem Grund: \ Würde ich stattdessen schreiben $ scope.addToList = $ .proxy (groceryInterface.addToList, $ Scope) '? – LazerSharks