Angular:控制器指令与关注点分离的交互

时间:2015-06-10 10:33:29

标签: javascript angularjs separation-of-concerns

我有一个AngularJS模块,它定义了一个可以显示scr="filename"属性的WebGL场景的nice指令。这很好用(在这里和那里剪断)看起来大致如下:

angular.module('ThreeViewer', [])
.directive('three', ['$http', function ($http) {
  return {
    link: function (scope, element, attr) {
      scope.renderer = new SceneRenderer(element[0])
      $http.get(attr.src)
      .success(function (json) {
        var loader = new THREE.ObjectLoader()
        var scene = loader.parse(json)
        this.scene = scene
        this.renderer.setScene(scene)
      }.bind(scope))
    },
    restrict: 'AC',
    scope: {
      src: '='
    }
  }
}])

它的作用是加载场景,将其保存到范围内,然后将其传递给渲染器。这很有效。

现在我想创建一个控制器,以便用户可以与数据交互,比如旋转对象。我的问题是,在坚持分离关注点的角度范式的同时,应该如何处理这个问题?我的理解是,在Angular中,控制器应该能够在没有指令的情况下工作,反之亦然 - 不知道彼此之间的任何事情。这是否意味着控制器无法直接修改scope.scene对象?那怎么一个呢?

正如猜测一样,控制器是否应该“旋转”而不知道它在旋转什么?那么该指令应如何选择呢?

或者,控制器编辑scope.scene是否完美无缺?那么我的问题是如何将其打破隔离?

1 个答案:

答案 0 :(得分:1)

我会将场景逻辑(包括加载/解析)放入自己的service(或多个,一个用于json解析,一个用于旋转等)。我认为conrollerscene对象传递给service没有问题,它应该不包含特定的逻辑,因为它的作用应该只是在{{1}之间进行调解包含逻辑和service

对于范围界定,我会使用viewSceneController参数为指令实例化controller(例如),并将场景附加到controllerAs。这样controller就是一个特定的SceneController,可以为controller提供丰富的视图和控件。