我正在尝试确定正确的方法或Angular方式来为构造DOM的指令提供数据。作为我的例子,我正在尝试从文件中获取JSON数据以使用jsTree构造树。问题是在数据到达时而不是事先建立树。
我通过控制器中的$watch
treeData
解决了问题。如果我没有$watch
,那么将使用空数组构造树作为输入,稍后,Angular将更新引用以填充数据。但我觉得这样做是错误的,因为在最初构建树之后数据不会改变。
这是我的代码
app.js:
var app = angular.module('jsTreeApp', ['ngResource']);
var TestCtrl = function($scope, Data) {
$scope.treeData = Data.getTreeData();
}
app.directive('jstree', function() {
return function(scope, element) {
scope.$watch('treeData.data', function() {
$(element).jstree({
"json_data" : scope.treeData,
"plugins" : [ "themes", "json_data" ]
});
})
}
});
app.factory('Data', function($resource) {
return $resource('/data/treeData.json', {}, {
getTreeData: { method: 'GET', isArray: false }
})
})
的index.html:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>jsTreeAngular</title>
</head>
<body>
<div ng-controller="TestCtrl" ng-app="jsTreeApp">
<div jstree></div>
</div>
<script src="lib/angular/angular.js"></script>
<script src="lib/angular/angular-resource.js"></script>
<script src="js/app.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="lib/jstree/jquery.jstree.js"></script>
</body>
</html>
有关正确方法的建议吗?
答案 0 :(得分:3)
我没有看到使用$ watch的问题,因为你绑定它,你需要一些方法来查看数据是否已填充并对其采取行动。
我在这里看到的问题是“treeData”的来源并不明显,这可能会让其他开发者感到困惑。
我要做的是定义一个隔离的范围并使用treeData传递一个属性,这样你可以保持它松散耦合,而不必担心在控制器中更改“treeData”的名称。
您可以像这样定义隔离范围:
app.directive('jstree', function() {
return {
scope: {
treeData: "="
},
link: function(scope, element) {
scope.$watch('treeData.data', function() {
$(element).jstree({
"json_data" : scope.treeData,
"plugins" : [ "themes", "json_data" ]
});
})
}
}
});