2013-03-02 28 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

相關問題