我有一个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
是否完美无缺?那么我的问题是如何将其打破隔离?
答案 0 :(得分:1)
我会将场景逻辑(包括加载/解析)放入自己的service
(或多个,一个用于json解析,一个用于旋转等)。我认为conroller
将scene
对象传递给service
没有问题,它应该不包含特定的逻辑,因为它的作用应该只是在{{1}之间进行调解包含逻辑和service
。
对于范围界定,我会使用view
和SceneController
参数为指令实例化controller
(例如),并将场景附加到controllerAs
。这样controller
就是一个特定的SceneController
,可以为controller
提供丰富的视图和控件。