【发布时间】:2017-03-09 10:58:27
【问题描述】:
我有一个 Angular 应用程序,它使用 d3 来显示项目,并且有一个 infoPanel 显示被点击项目的信息。这是可行的,但单击该项目以激活/打开信息面板不起作用。
在d3数据控制文件中,我有:
'use strict';
var settings ;
angular.module('App')
.directive('data', ['sessionmgmt', 'thedata', 'gui', function (session, data, gui) {
return {
link: function postLink(scope, element, attrs) {
var promise = angular....getData...;
promise.then(function () {
settings = session.settings;
svg = ...
createItems(svg, items);
}, function () {});
}
};
}]);
function createItems(svg, items) {
let item = svg.append("g")
.attr("class", "nodes")
.selectAll(".node")
.data(items, function (d) {
return d.id;
});
appendIcons(item);
}
function appendIcons(nodes){
nodes = nodes.enter().append("g")
.attr("class", "node");
nodes.append("title")
.text(function (d) {
return d.data['label'];
});
nodes.on("click",function(d){
if(settings.selectedItem === d.id){
settings.selectedItem = null;
}else{
settings.selectedItem = d.id;
}
});
}
然后在我的 infoPanel 控制器中,我有:
'use strict';
angular.module('App')
.controller('ContentpanelCtrl', ['$scope', 'sessionmgmt', function ($scope, sessionmgmt) {
var contentPanel = this;
this.settings = sessionmgmt.settings;
$scope.activate = function activate() {
contentPanel.settings.contentPanelOpen = true;
};
$scope.getSelected = function getSelected(){
return contentPanel.settings.itemSelected;
}
$scope.isNodeSelected = function isSelected(){
return contentPanel.settings.itemSelected !== null;
}
$scope.$watch("contentPanel.settings.itemSelected", function(newVal, oldVal) {
console.log(newVal);
if (newVal !== oldVal){
$scope.activate();
}
});
}]);
第一次加载页面时,console.log 正在运行,但是当我点击这些项目时,这个手表没有被触发。 我知道“点击”正在工作,因为 getSelected 在我的信息面板上显示了正确的数据。 'watch' 和 getSelected 都使用完全相同的设置变量....难住了。
【问题讨论】:
-
在您的控制器中添加点击功能,并在您的 html 中为指向该功能的项目添加
ng-click。当你在外面使用 jQuery 进行操作时,我认为 Angular 并没有意识到这种变化。 -
您是否尝试过将作用域传递给
createItems,然后是appendIcons函数并在点击事件后调用scope.$apply()? -
@Razzildinho - 这真是个好建议!谢谢你。我仍然没有让 $watch 函数工作,但不需要,因为我的 click 函数现在运行
contentPanel.settings.contentPanelOpen = true;并且 scope.$apply 使其可见。 -
如果您将其作为答案发布,我会将其标记为已接受。
标签: javascript angularjs d3.js