听取对象时,$ watch不起作用

时间:2014-09-05 22:54:59

标签: angularjs watch

我的控制器范围内有一个变量,它的值应该在视图中使用的指令中观察,如下所示:

<grid options="gridOptions" />    // view's markup

# --- controller ---

# not important, just to show that columns loaded lazily    
schemaService.getColumns().then (cols)-> $scope.columns = cols  

$scope.gridOptions = 
  columns: $scope.columns                 # here, this wouldn't work
  # but, if done like this:
  columns: -> return $scope.columns       # note: it's a function 


# --- and inside the 'grid' directive ---

cols = -> 
  return scope.options.columns           # again this wouldn't work
  return scope.options.columns()         # but if it's done like a function - does

scope.$watch cols, (newVal, oldVal)->
    console.log "columns changed"
,true

因为你可以看到我将gridOptions.columns的值设为一个函数 - 它可以工作,如果我将它作为一个对象 - $ watch无法看到任何更改,

我不希望它作为一个函数,我想将它作为一个对象访问,我甚至试图让gridOptions.columns返回自我可执行文件 - 仍然没有工作

我很好奇为什么会发生这种情况

1 个答案:

答案 0 :(得分:1)

问题是$scope.gridOptions.columns绑定到基元。为了使其按照您的意愿运行,您需要修改控制器,以便通过引用传递列:

$scope.gridOptions = {}

schemaService.getColumns().then (cols) -> 
  $scope.gridOptions.columns = cols

指令中的$watch现在将按预期对更改作出反应。