2013-11-04 21 views
0

我在angularJS中的$ broadcast有問題。我的控制器使用$ compile函數在頁面加載時動態地向DOM添加指令元素。

$('#container').prepend($compile('<myDirective></myDirective>')($scope)); 
$scope.$broadcast('loadIt', stuffIneedLoaded); 

我想要做的是在指令被創建時調用指令作用域函數,所以我使用$ broadcast。現在發生的事情是,在指令完成渲染之前調用$ broadcast,因此指令中的作用域$ on不會聽到廣播。

從向鏈路功能:

link: function (scope, element, attrs) { 
     scope.$on('loadIt') = function (stuffToLoad) { 
     //stuff to load 
    } 
} 

我需要使用廣播的原因是因爲我需要從控制器發送指令數據。

http://jsfiddle.net/5ReCu/

小提琴不起作用,只是樣板,以幫助傳達什麼,我拍攝的:

任何想法?謝謝大家!

+0

小提琴的作品.... http://jsfiddle.net/5ReCu/1/不知道你爲什麼不使用數據服務,但修改你的問題。沒人能猜到。似乎非正統不通過屬性傳遞數據給控制器,或者服務雖然 – charlietfl

+2

剛剛看到了jsfiddle和-imho-你的設計完全違背了所謂的「角度禪」。在控制器中寫入jquery.prepend和$ compile ......這裏有另一種方法。你究竟想要做什麼? –

回答

0

我會使用兩個指令並從另一個調用。此外,編譯後會調用調用廣播的scope方法。喜歡的東西:

var fessmodule = angular.module('myModule', []); 

fessmodule.controller('fessCntrl', function ($scope) { 
    $scope.recall = function() { 
     $scope.$broadcast('loadIt'); 
    }; 
}); 

fessmodule.$inject = ['$scope']; 


fessmodule.directive("myDirective", function() { 
    return { 
     restrict: 'E', 
     template: "<div>test code</div>",   
     link: function (scope, element, attrs) { 
      scope.$on("loadIt", function() { 
       console.log('in myDirective on'); 
      });   

     } 
    } 
}); 

fessmodule.directive('directiveFoo', function($compile) { 
    return {  
     controller: function() { 
      console.log('in foo ctrl');    
     }, 
     link: function (scope, element, attrs) { 
     var elem_0 = angular.element(element[0]); 
     var a_input = angular.element($compile('<my-directive></my-directive>')(scope)); 
     elem_0.prepend(a_input); 

      scope.recall(); 
     } 
    } 
}); 

演示Fiddle

作爲一個側面說明:

我強烈建議,以避免在控制器的任何DOM更新/操作。使用指令。通過這種方式,我們可以通過呼叫隊列控制和追蹤大多數問題。