Can I watch a controller scope property from inside a directive?

Assuming that this watch is inside a directive is it possible to watch a variable from the main controller like this? Here is the whole directive. When it looks like this the watch does get triggered on the first page load but then never again. I do not pass questionNumber to the directive. Is this why it is not aware of it?

    .directive('videoLoader', function () {
return function (scope, element, attrs) {
    scope.$watch(attrs.videoLoader, function () {
        element[0].load();
        element[0].play();
        $(scope.video).bind('ended', function () {
            $(this).unbind('ended');
            if (!this.ended) {
                return;
            }
            scope.tutorialNumber++;
            scope.$apply();
            scope.loadFromMenu();
        });
    });
    scope.$watch(scope.questionNumber, function(){
        if (scope.sectionNumber === 0 && scope.tutorialNumber === 0) { //if first video play congratulations etc
            if (scope.questionNumber === 1) {
                start(164.15);
                pause(166.8);
            } else if (scope.questionNumber === 2) {
                start(167.1);
                pause(170);
            } else if (scope.questionNumber === 3) {
                start(171.1);
            }
        }
    });
}

})

scope.$watch('questionNumber', function(newValue, oldValue){//something}. I havent tried out an example before posting this, but i remember trying like this before.

Please note that scope.$watch(scope.questionNumber... is now scope.$watch('questionNumber'...

Since your directive is not creating a new scope or an isolate scope, it uses the scope that is in affect where the directive is used in the HTML. If controls is a directive and it creates a new or isolate scope, then the video-loader directive will also use that scope. This might explain why @rajkamal's answer didn't work for you.

If controls is not a directive, than video-loader will use the controller's scope (unless you have video-loader in an ng-repeat or some other directive that creates a child scope.) Without showing us more of your HTML, it is not possible to determine what scope your directive will get.

Here is a plunker showing how a video-loader directive, used inside a controller scope, has access to that scope (in particular, a questionNumber property).

Although it might take some time getting used to jsfiddle and plunker, I highly recommend spending the time. People can help you much faster if you have a jsfiddle or plunker.

hallelujah I've done it! The answer is no, apparently directives can't see into scopes of other controllers, they have to be passed in via attributes in the HTML, this was fine with just one attribute but I was struggling to get 2 in, turns out it can be done like this

<video video-loader class="video-js vjs-default-skin" id="myvideo" congrats="questionNumber" video-loader="tutorialNumber" id="video" controls>
    <source type="video/mp4" src="{{videoURLs[tutorialNumber]}}.mp4"></source>
    <source type="video/webm" src="{{videoURLs[tutorialNumber]}}.webm"></source>
    Your browser does not support the video tag.
</video>

Then accessed inside the directive with a second $watch like so:

directive('videoLoader', function () {
    return function (scope, element, attrs) {
        scope.$watch(attrs.videoLoader, function () {
            element[0].load();
            element[0].play();
            $(scope.video).bind('ended', function () {
                $(this).unbind('ended');
                if (!this.ended) {
                    return;
                }
                scope.tutorialNumber++;
                scope.$apply();
                scope.loadFromMenu();
            });
        });
        scope.$watch(attrs.congrats, function(){    
            scope.questionNumber;
            if (scope.sectionNumber === 0 && scope.tutorialNumber === 0) { //if first video play congratulations etc
                if (scope.questionNumber === 1) {
                    start(164.15);
                    pause(166.8);
                } else if (scope.questionNumber === 2) {
                    start(167.1);
                    pause(170);
                } else if (scope.questionNumber === 3) {
                    start(171.1);
                }
            }
        });
    };
})