2016-02-08 2 views
1

У меня есть следующая директива. Когда я запускаю функцию open и добираюсь до отладчика, я получаю сообщение об ошибке в консоли, которое сообщает Uncaught ReferenceError: $scope is not defined(…).

Как можно позвонить $scope.open, когда $scope не определено?

app.directive('photo', ['$http', 'modal', function($http, modal) { 
    return { 
     replace: true, 
     templateUrl: '/assets/photo.html', 
     transclude: false, 
     scope: { 
      result: '=', 
      index: '@' 
     }, 
     controller: ['$scope', '$http', 'modal', function($scope, $http, modal) { 
      $scope.prev = $scope.index - 1; 
      $scope.open = function() { 
       debugger; 
      }; 
     }] 
    } 
}]); 

Вот мой DOM:

<div ng-repeat="r in results" photo result="r" index="$index"></div> 

Если я вставляю console.log($scope) как раз перед моей open функции, а затем снова прямо перед debugger в этой функции, я получаю следующие результаты. Левое перед open называется, справа после open. enter image description here

+0

Что вы видите, когда вы добавляете эту строку перед '' 'отладчик,' '' '' '' console.log ($ сфера); '' '. Это может быть важно, потому что компилятор может оптимизировать вашу переменную $ scope, когда вы находитесь внутри $ scope.open. –

+0

Я только что обновил свой вопрос на скриншоте. Обратите внимание, что 'temp1! = Temp2'. – ACIDSTEALTH

+0

'$ id' не должен быть строкой. Рамка AngularJS использует числа для области '$ id'. Что-то вне Angular возится с этой зарезервированной переменной. – georgeawg

ответ

3

Вы впрыскивать $http и modal в определении директивы (как вы это делали), нет необходимости в функции контроллера, просто сделать:

controller: function($scope) { 
     $scope.prev = $scope.index - 1; 
     $scope.open = function() { 
      debugger; 
     }; 
    } 
+0

Хорошо, поэтому это решает проблему, но что я хотел бы знать, почему? Я использовал один и тот же формат инъекции зависимостей для многих других директив без каких-либо проблем. Почему это было бы иначе? – ACIDSTEALTH

+0

Извините, но я действительно не знаю причину этого :( –

+0

Его синтаксис для ввода $ scope должен работать нормально. Проверьте «Создание директив, которые обмениваются» в [docs] (https: // docs .angularjs.org/guide/directive). –

0

Это должно работать:

app.directive('photo', ['$http', 'modal', function($http, modal) { 
return { 
    replace: true, 
    templateUrl: '/assets/photo.html', 
    transclude: false, 
    scope: { 
     result: '=', 
     index: '@' 
    }, 
    controller: function($scope, $http, modal) { 
     $scope.prev = $scope.index - 1; 
     $scope.open = function() { 
      debugger; 
     }; 
    } 
} 
}]); 
0

Вам нужно определить $ Scope в верхней части, то есть:
app.directive ('фото', ['$ http', '$ Scope', 'modal', function ($ http, $ Scope, modal)

Теперь все будет хорошо.

+0

Вы не вводите '$ scope' в такая директива. Моя инъекция зависимостей правильна.Я знаю, потому что у меня есть десятки других директив, следуя тому же формату, который отлично работает. – ACIDSTEALTH

+0

Спасибо, что поправили меня. –

1

Попробуйте добавить инструкцию, которая использует $scope в $scope.open. Возможно, Chrome оптимизировал $scope, когда вы находитесь в $scope.open, потому что вы его не используете.

$scope.open = function() { 
    console.log($scope); 
    debugger; //now you should see $scope. 
}; 
0

его работал для меня

var app = angular.module("moduleTest",[]); 
app.directive("testDirective",function(){ 
    return { 
     restrict: "A", 
     scope: true, 
     link: function(scope, element){ 
      //code 
      //and $scope is scope 
     } 
    } 
});