2013-03-02 29 views
2

假设这只手表位于指令内,可以像这样从主控制器观察变量吗?这是整个指令。当它看起来像这样,手表确实会在首页加载时触发,但不会再次触发。我不会将questionNumber传递给指令。这是为什么它不知道它?我可以在指令中看到控制器范围属性吗?

.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); 
      } 
     } 
    }); 
} 

})

回答

3

因为你的指令,也没有创造新的范围内,或者隔离范围,它使用的是范围影响HTML中使用指令的地方。如果controls是一个指令,并且它创建一个新的或隔离范围,那么video-loader指令也将使用该范围。这也许可以解释为什么@ rajkamal的答案不适合你。

如果controls不是指令,那么视频加载器将使用控制器的作用域(除非在ng-repeat或创建子作用域的其他指令中有视频加载程序。)不向我们展示更多HTML ,不可能确定您的指令的范围。

这里是a plunker显示了在控制器范围内使用的视频加载器指令如何访问该范围(特别是questionNumber属性)。

虽然可能需要一些时间才能习惯jsfiddle和plunker,但我强烈建议花时间。如果你有jsfiddle或plunker,人们可以更快地帮助你。

+0

我会记住这一点,并不是说我根本不会陷入沉重的压力,它只是因为如果你开始逐渐消失,这个特定的应用程序并不真正起作用,没有任何事情可以独立工作。无论如何,谢谢你的伟大答案 – Tules 2013-03-03 18:58:32

3

scope.$watch('questionNumber', function(newValue, oldValue){//something}。在发布之前,我没有尝试过一个例子,但我记得以前这样尝试过。

请注意,scope.$watch(scope.questionNumber...现在scope.$watch('questionNumber'...

+0

问题编号出现未定义,scope.questionNumber给出一个数字,因为它应该但仍然没有触发手表 – Tules 2013-03-02 08:45:59

+0

你可以准备一个jsfiddle。这可以帮助我看到问题 – rajkamal 2013-03-02 08:50:10

+0

我不能取决于视频,老实说,我从来没有让我的应用程序工作在小提琴或猛拉! – Tules 2013-03-02 08:51:36

0

哈利路亚我已经做到了!答案是否定的,显然指令不能看到其他控制器的作用域,它们必须通过HTML中的属性传递,这只需要一个属性即可,但我一直在努力获取2,结果可能是这样

<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> 

然后指令内访问与第二$手表,像这样做:

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); 
       } 
      } 
     }); 
    }; 
}) 
+0

答案是'有时':指令可以看到控制器范围在一定的条件。请参阅我的答案的细节 – 2013-03-03 00:09:42

+0

您使用'video-加载器“两次在同一个元素上错字? – 2013-03-03 00:11:20

+1

不,完全不了解角度是如何工作的! – Tules 2013-03-03 18:53:29

相关问题