更新服务变量时不会触发watch

时间:2014-04-10 22:32:51

标签: angularjs angularjs-scope

我正在尝试更改服务中的变量,但在发生这种情况时,控制器中的监视不会触发:

app.factory 'User',  ->
  class User
    status: 'offline'
    set_status: (status) ->
      @status = status

app.service 'Account', ->
  dsa: null
  test: 'asd'
  user: null

app.controller 'MainCtrl', ($scope, $timeout, Account, User) ->
  Account.user = new User
  $scope.$watch Account.user.status, (status) ->
    console.log "status changed to #{status}"

  $timeout ->
    Account.user.set_status 'busy'
    console.log Account.user.status
  , 2000

这是plunk。是什么原因?

1 个答案:

答案 0 :(得分:1)

$ watch没有任何问题。 $ watch表达式根据调用的范围进行计算,并将字符串表达式或函数作为其第一个参数。要使其正常工作,请在控制器内部发布Account作为范围,并通过字符串$来监视它:

Demo plunker

app.controller 'MainCtrl', ($scope, $timeout, Account, User) ->
  $scope.name = 'World'
  console.log Account
  Account.user = new User
  $scope.Account = Account
  $scope.$watch 'Account.user.status', (status) ->
    console.log "status changed to #{status}"

  $timeout ->
    Account.user.set_status 'busy'
    console.log Account.user.status
  , 2000

或者将监视表达式更改为返回Account.user.status属性的函数。我不熟悉咖啡脚本所以我会把这个例子留给你。