2015-01-12 32 views
1

在我的應用程序中,我有一個控制器和一個指令,我用它來繪製圖表。 所以我的模式是這樣的:$scope.d3DataGraph ={"selected":{"node":"","impiega":[],"impiegato": []} , "nodes":[],"links":[]};

在我設置了一個功能,增加了一些數據模型控制器

$scope.d3DataGraph.nodes.push(articolo); 

然後我有指令,它負責繪製圖形通過添加一些SVG標籤的DOM:

在我的指令

我有有當模型改變觸發渲染功能...

angular.module('myApp.directives') 
.directive('d3Graph', ['d3', function(d3) { 
    return { 
    restrict: 'EA', 
    scope: { 
     data: "=", 
     query: "=", 
     label: "@", 
     onClick: "&" 
    }, 
    link: function(scope, iElement, iAttrs) { 

     var svg = d3.select(iElement[0]).append("svg") 
     .attr("width", "100%") 
     .attr("height", "800px"); 
     var datatree = {}; 

     scope.$watch(function(){ return scope.data.nodes; }, function(){ 
      return scope.render(scope.data, scope.query); 
      } 
     ); 

     scope.render = function(datatreex, query){.... 

的指令「被稱爲」白衣這個標籤

<d3-graph data="d3DataGraph" selected = "selected" query = "selezionati"></d3-graph> 

問題是渲染功能,只有當加載頁面時被調用,而不是當控制器更新模型...

哪裏我錯了? 整體設置似乎是正確的,你怎麼看待它?

+0

OP - 如果對您有幫助,您是否還可以投我的答案,謝謝。 – elaijuh

回答

1

這是因爲$watch只是看scope.data.nodes的參考,所以無論你推或彈出什麼,參考不會改變。可以使用$watchCollection而不是使用$watch。它會檢測數組的長度。

scope.$watchCollection('data.nodes', function(){ 
    return scope.render(scope.data, scope.query); 
});