[英]Can't understand why $broadcast isn't working
我有一個名為'mainApp'的模塊。 在我的'mainApp'中,我創建了'MainCtrl',並在其上注入'appState'服務。 它用於保存將在其他模塊和許多控制器中使用的一些全局信息。
在我的'myApp'模塊中,我將另一個模塊聲明為依賴,我稱之為'keyboardShortcuts',我在其中創建了一個控制鍵盤事件的指令。
angular.module "mainApp"
.controller "MainCtrl", ['$rootScope','$scope','mensagemFactory','appState',($rootScope,$scope,mensagemFactory,appState) ->
$rootScope.$watch () ->
appState.getPointer 'actualScreenState'
, (newValue, oldValue) ->
console.log 'got here'
$rootScope.$broadcast 'screenState.changed'
undefined
$scope.consoleProcessos = () ->
mensagemFactory.getMensagens()
.then (data) ->
console.log 'processos: ' , data
,(error) ->
console.log 'erro: ', error
$scope.title = appState.getProp 'actualScreenState','title'
$rootScope.$on 'screenState.changed' , ->
$scope.title = appState.getProp 'actualScreenState','title'
$rootScope.$on 'keyboardShortcut.undo' , () ->
appState.undo 'actualScreenState'
$rootScope.$on 'keyboardShortcut.redo' , () ->
appState.redo 'actualScreenState'
undefined
]
這是我的appState代碼
angular.module "mainApp"
.factory "appState" , [() ->
return new AppState()
]
cloneObject = (obj) ->
if obj is null or typeof obj isnt 'object'
return obj
temp = obj.constructor()
for key of obj
temp[key] = cloneObject obj[key]
return temp
class AppState
storage = {
actualScreenState: [{
subject: 'AtosSuite'
}]
}
pointers = {
actualScreenState:0
}
historyStorage = {
}
window.storager = storage
window.pointers = pointers
getPointer: (collection)->
return pointers[collection]
undo: (collection) ->
if storage[collection] isnt undefined and pointers[collection] isnt undefined
if pointers[collection] > 0
pointers[collection] -= 1
return true
return false
else
return false
redo: (collection) ->
if storage[collection] isnt undefined and pointers[collection] isnt undefined
if pointers[collection] - 1 <= storage[collection].length
pointers[collection] += 1
return true
else
return false
else
return false
getCollect: (collection) ->
if storage[collection] isnt undefined
pointer = pointers[collection] or 0
return storage[collection][pointer]
else
return false
setNewCollect: (collection) ->
if storage[collection] isnt undefined
return false
else
pointers[collection] = 0
storage[collection] = {}
return true
getProp: (collection,prop)->
if storage[collection] isnt undefined
pointer = pointers[collection] || 0
return storage[collection][pointer][prop]
else
return false
setProp: (collection,properties,values)->
if storage[collection] isnt undefined
if pointers[collection] is undefined
pointers[collection] = storage[collection].length-1
pointer = pointers[collection] || 0
storage[collection] = storage[collection].slice 0,pointer+1
tempObject = cloneObject storage[collection][pointer]
if typeof properties is 'object'
for property,index in properties
tempObject[property] = values[index]
else
tempObject[properties] = values
storage[collection].push tempObject
pointers[collection] += 1
return true
else
return false
我的控制鍵盤事件的指令如下:
angular.module "keyboardShortcuts"
.directive 'globalDirective' , ['$rootScope','$document','$log',($rootScope,$document,$log) ->
{
restrict: 'A',
link: () ->
$document.bind 'keypress' , (event) ->
if event.keyCode is 26
$rootScope.$broadcast 'keyboardShortcut.undo'
if event.keyCode is 25
$rootScope.$broadcast 'keyboardShortcut.redo'
}
]
這是我使用我的服務的控制器:
angular.module "mainApp"
.controller "screenState", ['$rootScope','$scope','appState',($rootScope,$scope,appState) ->
$scope.possibleStates = [
'page1',
'page2',
'page3',
'page4'
]
$scope.actualState = 0
appState.setProp 'actualScreenState' , ['possibleStates','actualState'] , [$scope.possibleStates,0]
$scope.changeState = (newIndex) ->
$scope.actualState = newIndex
appState.setProp 'actualScreenState' , ['actualState','title'] , [$scope.actualState,(appState.getProp 'actualScreenState', 'possibleStates')[$scope.actualState]]
undefined
undefined
]
問題是:當我使用'screenState'控制器的'changeState'方法時,我的$ watchched對象被更改,它$ broadcast我的事件,接收到許多其他控制器。 但是,當我觸發我的鍵盤事件時,它被我的指令接收,這改變了我看到的$對象但是我的$ watch函數沒有得到它。 我可以在我的控制台中檢查對象更改,但不知何故我的$ watch事件未被觸發。
有任何想法嗎?
$watch
只能確定在消化周期中監視的值是否已更改,而您的按鍵事件監聽器不會導致該值。
一個簡單的解決方案是調用$rootScope.$digest();
在按鍵事件監聽器的末尾。 但是,隨着應用程序的增長,這會導致性能問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.