簡體   English   中英

無法理解為什么$ broadcast無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM