2013-12-09 4 views
0

Я пытаюсь получить доступ к функции, определенной в области контроллера, из директивы, вложенной в другую директиву. Я использую «&» и передавая имя функции в качестве атрибута директивы, однако я до сих пор не могу достичь функции в области контроллера.Доступ к функции контроллера в области действия директивы

Может ли кто-нибудь исправить ошибки, если я ошибаюсь? Я потратил несколько часов, пытаясь найти, что мне нужно использовать «&» для достижения объема контроллера, но застрял здесь после того, что я сделал.

JSFiddle здесь - http://jsfiddle.net/fwR9Q/12/

Код:

<div ng-controller="PlayerCtrl"> 
<div class="col-md-4 col-sm-6 col-xs-12" ng-repeat="video in videos" > 
<tf-video src="{{video.src}}" width="{{video.width}}" handleClick="playVideo(videoId, modeNum)" height="{{video.height}}" title="{{video.title}}"/> 
</div> 
</div> 

<script> 
    var myApp = angular.module('myApp', []); 

myApp.controller('PlayerCtrl', 
    function PlayerCtrl($scope,$log, trailers) 
    { 
    $scope.videos = trailers; 
    $scope.playVideo = function(videoId, modeNum){ 
     alert("video Id = " + videoId + "; mode Num = " + modeNum); 
     return false; 
    }; 
    } 
); 

myApp.directive('tfVideo', function() { 
    return{ 
    restrict: 'AE', 
    scope: { 
     src: '@', 
     handleClick: '&', 
     width: '@width', 
     height: '@height' 
    }, 
    template: '<a href="#" ng-click="handleClick({videoId: {{src}}, modeId: modeNum{{$parent.$index}} })"><img src="http://img.youtube.com/vi/{{src}}/0.jpg" height="{{height}}" width="{{width}}"/></a>' 
    }; 
}); 

myApp.factory('trailers', function(){ 
    var trailerVideos = [ 
     { 
     src:"6kw1UVovByw", 
     width:"324", 
     height:"300" 
     }, 
     { 
     src:"uWgDVz4NEO4", 
     width:"324", 
     height:"300" 
     } 
    ]; 
return trailerVideos; 
}); 
</script> 

Спасибо

+1

, поскольку все, что вы делаете, используя директиву для создания шаблона, почему бы вам даже не нужна изолированная сфера? – charlietfl

ответ

2

1) В вашей декларации директивы:

<tf-video src="{{video.src}}" width="{{video.width}}" handleClick="playVideo(videoId, modeNum)" height="{{video.height}}" title="{{video.title}}"/> 

Поскольку атрибуты используют змеиную обсаженную форму.

Вместо: handleClick=

Вы хотите змею накладного: handle-click=

2) В шаблоне:

template: '<a href="#" ng-click="handleClick({videoId: {{src}}, modeId: modeNum{{$parent.$index}} })"><img src="http://img.youtube.com/vi/{{src}}/0.jpg" height="{{height}}" width="{{width}}"/></a>' 

Вместо: {videoId: {{src}}, modeId: modeNum{{$parent.$index}} }

Вы хотите: {videoId: src, modeNum: $parent.$index }

Поскольку вам нужно имя параметра modeNum, чтобы оно соответствовало шаблону и директиве, и вы хотите отображать непосредственно переменные, а не выражения.

Updated fiddle

Смежные вопросы