向Angular指令提供数据(来自文件或数据库)

时间:2013-02-03 22:16:29

标签: javascript angularjs angularjs-directive

我正在尝试确定正确的方法或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>

有关正确方法的建议吗?

1 个答案:

答案 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" ]
           });
         })
       }
    }
});