Javascript $watch on指令,将嵌套对象的隔离范围作为crossfilter的属性

Javascript $watch on指令,将嵌套对象的隔离范围作为crossfilter的属性,javascript,angularjs,json,angularjs-directive,crossfilter,Javascript,Angularjs,Json,Angularjs Directive,Crossfilter,我已经创建了一个具有独立作用域、元素的指令,并且正在使用传入的那些值来构建d3/dc图表。因此,我有一些数据通过$scope上的交叉过滤器,以便指令属性可以读取它。然后我进入指令,日志记录范围显示它很好,但是如果没有未定义,我无法专门/直接访问嵌套对象 在控制器内: var data = [{ "player": "Player A", "team": "New York", "hits": 200 }, { "player": "Player B

我已经创建了一个具有独立作用域、元素的指令,并且正在使用传入的那些值来构建d3/dc图表。因此,我有一些数据通过$scope上的交叉过滤器,以便指令属性可以读取它。然后我进入指令,日志记录范围显示它很好,但是如果没有未定义,我无法专门/直接访问嵌套对象

在控制器内:

var data = [{
    "player": "Player A",
        "team": "New York",
        "hits": 200
}, {
    "player": "Player B",
        "team": "New York",
        "hits": 225
}, {
    "player": "Player C",
        "team": "New York",
        "hits": 1
}, {
    "player": "Player D",
        "team": "San Francisco",
        "hits": 268
}, {
    "player": "Player E",
        "team": "San Francisco",
        "hits": 22
}, {
    "player": "Player F",
        "team": "Seattle",
        "hits": 2
}, {
    "player": "Player G",
        "team": "Seattle",
        "hits": 25
}]
$scope.ndx = crossfilter(data);
$scope.playerDim = $scope.ndx.dimension(function (d) {
     return d.player;
});

$scope.playerGrp = $scope.playerDim.group().reduceSum(function (d) {
   return d.hits;
});
html

我的猜测是,当我使用console.log时,函数并没有真正在那里设置对象,尽管它在那里显示了它。我尝试了$watch、$timeout等等,但似乎没有任何东西允许我访问嵌套对象

有人能帮我了解一下这里发生了什么吗?

试试用$watch


可能是crossfilterdata中发生了异步事件。控制台中的对象具有继承性,不是快照。创建一个复制问题的演示,它真的是您从edior复制的代码吗?有几个错误。正如@charlietfl所提到的,可能正在进行异步操作。作用域是一个您正在记录的对象,它可以正常记录,但此对象上的维度属性是由某个异步操作创建的,在记录时它没有填充,这就是为什么您没有将其定义为值。非常感谢。我在$watch中错过了一个很明显的东西…漫漫长夜。
    <my-chart id="someChart"
                   chart-type="pieChart"
                   height="200"
                   width="200"
                   dimension="playerDim"
                   group="playerGrp" />
myApp.directive('myChart', ['chartFactory' function(chartFactory) {
    return {
       restrict: 'E',
       scope = {
          chartType: "@",
          height: "@",
          width: "@",
          dimension: "=",
          group: "="
       },
       link: function(scope, elem, attr) {
          console.log(scope) // shows the dimension object as a property on the object just fine
          console.log(scope.dimension) // undefined
       }
    };
}])
link: function(scope, elem, attr) {      
  scope.$watch('dimension', function(nVal, oVal) {
    if (nVal) {
      console.log('dimension=', scope.dimension);
    }
  });
}