【问题标题】:Can't access attr data in angular custom directive link function无法在角度自定义指令链接函数中访问 attr 数据
【发布时间】:2017-02-09 20:55:40
【问题描述】:

我正在尝试访问由自定义指令的链接函数中的控制器定义的 attr 数据。

这是一些简单的角度标记:

<div class='barChart'>
  {{vm.totals}}
  <bar-chart chart-data='vm.totals'></bar-chart
</div>

这是指令定义:

angular
    .module('app')
    .directive('barChart', [Callback])

function Callback() {
    return {
      restrict: 'E',
      replace: false,
      scope: {data: '=chartData'},
      link: (scope, el, attrs) => {
        console.log(scope);
        console.log(el);
        console.log(attrs.chartData);
      }
    }
}

当我记录范围时,我可以按预期看到该对象中的数据数组,这是一张图片:

如您所见,数据是底部的 10 项数组。该数组也显示在浏览器中,因此数据就在那里。但是,只要我更改 console.log 以记录该属性:

console.log(scope.data)

打印出来的值是未定义的。我正在尝试访问链接函数中的数据,以便可以使用 d3 创建可视化。数据在那里,但只要我在范围内调用.data,它就没有定义。有什么想法吗?

【问题讨论】:

  • 或任何不使用范围并从 html 中的指令中获取 attr 数据的想法?

标签: javascript angularjs d3.js


【解决方案1】:

使用 $watch 记录数据:

angular
    .module('app')
    .directive('barChart', [Callback])

function Callback() {
    return {
      restrict: 'E',
      replace: false,
      scope: {data: '=chartData'},
      link: (scope, el, attrs) => {
        console.log(scope);
        console.log(el);
        console.log(attrs.chartData);
        //USE $watch
        scope.$watch("data", function(value) {
          console.log(value);
        });
      }
    }
}

【讨论】:

    【解决方案2】:

    在链接函数中使用@ 可以通过一种方式绑定到控制器。

    angular
        .module('app', [])
    .controller('ctrl', function($scope){$scope.totals="1234";})
        .directive('barChart', [Callback])
    
    function Callback() {
        return {
          restrict: 'E',
          replace: false,
          scope: {data: '@'},
          link: function(scope, el, attrs) {
            console.log(attrs.chartData);
          }
        }
    }
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="app" ng-controller="ctrl">
    <div class='barChart'>
      {{totals}}
      <bar-chart chart-data='{{totals}}'></bar-chart>
    </div>
      </div>

    【讨论】:

    • @ 是属性绑定。单向绑定是&lt;
    【解决方案3】:

    您可以将vm.totals 作为范围变量访问,但作为属性传递:

    scope: {
      chartData: '='  //@ reads the attribute value
    }
    

    在你的 html 中:

    <bar-chart chart-data='vm.totals'></bar-chart>
    

    现在在链接功能中您可以访问它:

    console.log(scope.chartData);
    

    请注意,这是一种方式绑定,因此如果您需要两种方式,则需要改用=

    更新:

    如果您使用异步调用,则需要使用两种方式绑定或注意链接功能的变化:

    scope.$watch('chartData', function(newVal) {
        if(newVal) {  console.log(scope.chartData) }
    }, true);
    

    请注意,由于它是一个数组,因此最好使用集合监视(true 作为最后一个 arg)。

    【讨论】:

    • 将字符串文字 'vm.totals' 绑定到 chartData 而不是来自控制器的数据。
    • 抱歉忘记在 html 中添加插值 @AndrewKim 检查更新
    • 那种..作品。它使我看到了一串数组数据。但是我遇到了同样的问题,当我console.log(scope) 时我可以看到它很好。只要我console.log(scope.chartData) 它记录一个空字符串 =(
    • 应该是数据还没有..什么的
    • 我认为这与我通过服务对 csv 文件进行的异步调用有关以获取数据。
    猜你喜欢
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多