【问题标题】:Angular data issue- not sure how to troubleshoot角度数据问题 - 不确定如何排除故障
【发布时间】:2014-06-26 00:47:10
【问题描述】:

我有一个控制器(下面的代码),它链接到 d3-cloud 指令并且运行良好。数据被添加到控制器中并传递给指令。

myApp.controller('DownloadsCloudCtrl', ['$scope', 
                                        '$rootScope', 
                                        'requestService',
                                        '$cookieStore',
  function($scope, $rootScope, requestService, $cookieStore){
  $scope.d3Data = [
    {
        'kword': 'a',
        'count': 141658,
    },{
        'kword': 'b',
        'count': 105465,
    }
  ];
}]);

现在我正在尝试通过将控制器切换到以下代码来从 JSON 请求服务中提取数据。当我在$scope.d3Data = data 行下方的控制器中执行console.log 时,一切似乎都正常工作(返回了正确的数据)。

但是,当尝试将控制器链接到指令时,由于某种原因,指令正在获取未定义/空数据集。

我想知道问题是否在于代码执行的顺序。也许控制器试图在 JSON 服务完成之前将数据传递给指令,从而导致没有绘制图形。会不会发生这种情况,如果发生了,我该如何解决?

myApp.controller('DownloadsCloudCtrl', ['$scope', 
                                        '$rootScope', 
                                        'requestService',
                                        '$cookieStore',
  function($scope, $rootScope, requestService, $cookieStore){
  $rootScope.$on('updateDashboard', function(event, month, year) {
    updateDashboard(month, year);
  });

  var updateDashboard = function(month, year) {
    requestService.getP2PKeywordData(month, year).then(function(data) {
      $scope.d3Data = data;
    });
  };

  updateDashboard($cookieStore.get('month'), $cookieStore.get('year'));
}]);

编辑:指令代码:

myApp.directive('d3Cloud', ['$window', 
                            'd3Service', 
                            'd3Cloud', 
                            function($window, 
                                     d3Service, 
                                     d3Cloud) {
  return {

    // Restrict usage to element/attribute
    restrict: 'EA',

    // Manage scope properties
    scope: {

      // Bi-directional data binding
      data: '=',

      // Bind to DOM attribute
      label: '@'
    },

    // Link to DOM
    link: function(scope, element, attrs) {

      // Load d3 service
      d3Service.d3().then(function(d3) {

        // Re-render on window resize
        window.onresize = function() {
          scope.$apply();
        };

        // Call render function on window resize
        scope.$watch(function() {
          return angular.element($window)[0].innerWidth;
        }, function() {
          scope.render(scope.data);
        });

        // Render d3 chart
        scope.render = function(data) {

        // d3 specific appends... not important

HTML 代码:(足够简单)

  <div class="col-md-6">
    <div class="module">
      <div class="inner-module" ng-controller="DownloadsCloudCtrl">
        <div class="module-graph">
          <d3-cloud data="d3Data"></d3-cloud>
        </div>
      </div>
    </div>
  </div>

【问题讨论】:

  • 您能否显示指令的代码和/或将数据(如果使用隔离范围)传递给指令的模板?

标签: javascript json angularjs d3.js


【解决方案1】:

尝试在 $scope.d3Data = data 之后添加 $scope.$apply();

$scope.d3Data = data;
$scope.$apply();

如果这不起作用,您始终可以将一个函数向下传递到指令中并将其设置为更新数据,然后从控制器手动调用它:

所以控制器逻辑:

$scope.updateDirective = function () {}; // this will be overridden in directive

指令逻辑:

scope: {
  data: '=',
  update: '&updateDirective'
  label: '@'
}

scope.updateDirective = function () {
  scope.render(scope.data); // call to update function
};

标记:

  <div class="col-md-6">
    <div class="module">
      <div class="inner-module" ng-controller="DownloadsCloudCtrl">
        <div class="module-graph">
          <d3-cloud data="d3Data" update-directive="updateDirective"></d3-cloud>
        </div>
      </div>
    </div>
  </div>

【讨论】:

  • 真的,真的很奇怪。我在控制器中添加了$scope.$apply(),它第一次工作。然后我刷新了页面,它一直给我$digest already in progress 错误。
  • 我尝试使用if(!$scope.$$phase) {$timeout 解决$digest 错误,但似乎都不起作用(即他们停止了控制台错误,但没有解决原来的问题)。跨度>
猜你喜欢
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
相关资源
最近更新 更多