2014-10-10 68 views
0

我有這個plunker顯示我的問題:http://plnkr.co/edit/bNha1xOrnhnyhvXtXSnX?p=preview如何調查指令中的範圍?

angular.module('docsTransclusionExample', []) 
.controller('Controller', ['$scope', function($scope) { 
    $scope.arr = [1,2,3,4]; 
}]) 

.directive('myDialog', function() { 
    return { 
    restrict: 'E', 
    scope: { 
     arr: '=' 
    }, 
    templateUrl: 'my-dialog.html', 
    link: function (scope) { 
     var lengthOfArray = scope.arr.length; 
     scope.test = 'The array length is ' + lengthOfArray; 
    } 
    }; 
}); 

在plunker,一切正常,我想:我設置scope.arr陣列,並在鏈接進行調查。這使我有可能將更多東西添加到示波器(測試)中,並將其打印出來。使用模板這樣的:

{{arr}} - {{test}} 

..我得到這樣的結果:

[1,2,3,4] - The array length is 4 

SO:在此實例中,陣列被設置在控制器上的正上方。但在我真正的實現中,數組是從服務器獲取的json對象。結果是,我不斷收到'未定義'的結果。我認爲這可能是由於指令詢問數據時的延遲(很小),直到它實際發送,同時指令中的鏈接沒有任何用處。

我可以嘗試一下嗎?

更新:

我做了這個Plunker,藉以說明問題:

http://plnkr.co/edit/bNha1xOrnhnyhvXtXSnX?p=preview

運行它,然後在結果窗口中,應該說是這樣的:

The array length is 5 
(content of array...) 

現在,如果你進入script.js(或任何其他文件),並添加一個linebre ak在底部什麼的,Plunker會重新加載頁面。然後,有時候,腳本將無法讀取該陣列,並且輸出只能是:

(content of array...) 

我試圖添加表,但不知道,如果我做正確..因爲它似乎沒有工作。

另一個有趣的事情是,這往往不會像Plunker那樣運作。但在本地主機上,這從來不起作用。

更新2

我管理這個使用$表來解決。 Plunker更新到正確的解決辦法:http://plnkr.co/edit/bNha1xOrnhnyhvXtXSnX?p=preview

.directive('myDialog', function() { 
    return { 
    restrict: 'E', 
    scope: { 
     contentOfList: '=' 
    }, 
    templateUrl: 'my-dialog.html', 
    link: function (scope) { 
     scope.counter = 0; 
     scope.$watch('contentOfList', function() { 
     scope.counter = scope.counter + 1; 
     var lengthOfArray = scope.contentOfList.categoryList[0].rows.length; 
     scope.test = 'The array length is ' + lengthOfArray; 
     }); 
    } 
    }; 
}); 

回答

0

如果不首先定義它,你可能會打一個未定義的錯誤,因爲ARR進行調用後,纔會創建。你嘗試創建一個空的數組,然後填充它?

喜歡的東西:

angular.module('docsTransclusionExample', []) 
.controller('Controller', ['$scope', '$http', function($scope, $http) { 
    $scope.arr = []; 
    $http.get("somedata.json").success(function(result) { 
     $scope.arr = result; 
    }); 
    }]); 

http://plnkr.co/edit/1yt3OSdrrbdTpa6FnWT8?p=preview 希望它可以幫助

+0

我已經完成了與您的建議不同的一點。請參閱我的第一篇文章的更新。 – 2014-10-13 10:30:57

0

有兩種方法來解決這個問題 1)你應該像routeprovider解析函數在控制器初始化之前獲取的數據,如果你正在使用路由 2)您應該使用手錶觀察更改並設置其內的屬性

scope.$watch('arr',function(newvalue,oldvalue){ 
      if(newvalue===oldvalue){return}; 
      scope.test=newvalue.length 
      },true); 
+0

我試過在指令中的鏈接裏面添加手錶,但它似乎沒有爲我做竅門。請參閱我的第一篇文章中的更新,有一個新的Plunker更清楚地說明我遇到的問題。 – 2014-10-13 10:32:08