2015-06-10 80 views
0

我有一个AngularJS模块,它定义了一个很好的指令,可以从scr="filename"属性中显示WebGL场景。这工作得很好,(在这里和那里剪断)看起来大致是这样的:角度:控制器 - 指令交互与关注点分离

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

你已经用src设置了一个独立的作用域,那么你为什么使用attrs.src而不是scope.src?而且,由于您已设置了隔离范围,控制器将无法更新scope.scene,因为它无法访问它。 –

+0

要扩展@AbhishekJain评论,请参阅隔离范围文档https://docs.angularjs.org/guide/directive#isolating-the-scope-of-a-directive。从这里,你在视图中链接2,通过属性 –

+0

除了我认为我必须使用'='以外,这不是故意的,所以我可以在一个控制器中有两个ng-3对象。也许我误解了教程。 – Paul

回答

1

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

对于作用域,我会实例化一个SceneController(例如)用于与所述controllercontrollerAs参数的指令和场景附加到controller。这种方式SceneController是一个特定的controllerscene提供丰富的观点和控制。