2012-12-27 68 views
30

如何從工廠或服務發出事件。我無法將$範圍注入工廠,因此無法發出事件。如何從工廠發出事件

我碰到下面的錯誤 - Unknown provider: $scopeProvider <- $scope

感謝, 穆爾塔扎

+0

爲什麼不看在控制器(S),而不是發射事件服務變量? –

+1

@AndersBornholm每個消化週期都會觸發角度的手錶功能。根據應用程序的不同,摘要循環可能會經常發生。 Pubsub提供更好的溝通渠道。它不需要評估每個摘要週期。 – kitimenpolku

回答

55

您不能將控制器的作用域注入到服務中。你可以做的是:

  • 傳遞範圍實例作爲參數傳遞給你的服務功能之一:

例如

app.factory('MyService', function() { 

    return { 
     myFunction: function(scope) { 
     scope.$emit(...); 
     ... 
     } 
    }; 
}); 
  • 注入$ rootScope爲您服務:

例如

app.factory('MyService', ['$rootScope', function($rootScope) { 

    return { 
     myFunction: function() { 
     $rootScope.$emit(...); 
     ... 
     } 
    }; 
}]); 
+0

+ 1爲答案 – murtaza52

+14

我是不是會用rootcope做廣播? – murtaza52

+0

我認爲這是向上發射事件的唯一方法,以便同級控制器不捕獲發射的事件 - 如果這就是你想要的(這是我的情況) –

54

進樣$ rootScope而不是$範圍,然後發射它的$ rootScope。

myApp.factory('myFactory', ['$rootScope', function ($rootScope) { 
    $rootScope.$emit("myEvent", myEventParams); 
}]); 

工廠沒有權限訪問當前控制器/指令範圍,因爲沒有一個。他們確實可以訪問應用程序的根目錄,這就是$ rootScope可用的原因。

+0

+ 1爲答案 – murtaza52

+2

這是正確的答案,工廠不得依賴控制器,因爲他們的生命週期完全不同。 –

-2

在你的工廠注入$ rootScope原樣

myApp.factory('myFactory',function($rootScope){ 
return({ 
// use $rootScope as below to pass myEventParams to all below in hierarchy 
$rootScope.$broadcast("myEvent",myEventParams); 

}) 
}]); 
+0

我真的不理解投票沒有給出適當的理由就沒有用的答案。非常不專業。 –

+2

那麼你的答案基本上是5年前答案的副本,並且不會添加任何內容,同時也比兩個現有的已接受答案不太清晰。你認爲你添加了哪些信息? – toxaq