是否使用 javascript 闭包(使用 angularjs 指令和 d3js 时)

标签 javascript angularjs d3.js

受到这个例子的启发angular directive with 2-way binding ,我做了一个简单的指令,一旦单击将更改父范围 codepen live 上的值。

.directive("haha", function() {
return {
  scope: {
    v: '='
  },
  template: `<div ng-click="myfun()">click me now</div>`,
  link: function(scope, element) {
    scope.myfun = function() {
      scope.v  = "clicked";
    }       
  }
}
});

现在我在“link”内添加一个用 d3 绘制的 svg 圆,并尝试使用 d3.on 添加类似的事件处理程序

d3.select(element[0]).append("svg").attr({width:300,height:300})
      .append("circle").attr({cx:100,cy:100,r:20})
      .on("click",function(){scope.v="clicked inside d3"; alert(scope.v)});

当我点击圆圈时,html页面上的{{value}}不会改变。 codepen live

这不是正确的吗,作为 javascript 闭包规则,在 on("click", function() ..., scope.v 内部应该仍然是相同的作为 link: function(scope...

中的 scope

最佳答案

您需要添加scope.$apply因为您正在“Angular 世界”“外部”更新范围,并且您希望 Angular 运行摘要循环。

d3.select(element[0]).append("svg").attr({width:300,height:300})
      .append("circle").attr({cx:100,cy:100,r:20})
      .on("click",function(){scope.$apply(function(){scope.v="clicked inside d3";})});

Codepen .

关于是否使用 javascript 闭包(使用 angularjs 指令和 d3js 时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35277615/

相关文章:

javascript - 如何从 jQuery.ajax 成功语句中推送父对象

angularjs - AngularJS $http 服务请求的默认超时是多少?

javascript - AngularJS - jQuery 返回元素集合

javascript - 未捕获的类型错误 : Cannot read property 'length' of undefined in d3. js

javascript - Onsen UI menu.SetMainPage 正在工作,但出现错误,导致 Phonegap 开发者应用程序出现奇怪的行为

javascript - 将文本框的值传递到另一个页面 html

javascript - Bootstrap Affix 插件导航栏顶部延迟

javascript - Moment js 时间选择器

javascript - 使用 D3.js 创建矩形图表

javascript - 使用 d3.js TreeMap 图 block 响应文本