我有一个 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: '='
}
}
}])
它所做的就是加载场景,将其保存到范围,然后将其传递给渲染器。这有效。
现在我想创建一个 Controller ,以便用户可以与数据交互,比如旋转对象。我的问题是,在坚持关注点分离的 Angular 范式的同时,应该如何解决这个问题?据我了解,在 Angular 中, Controller 应该能够在没有指令的情况下工作,反之亦然——无需相互了解。这是否意味着 Controller 无法直接修改 scope.scene
对象?那么该怎么做呢?
作为猜测, Controller 是否应该在不知道它在旋转什么的情况下“旋转”?那么指令应该如何选择它呢?
或者, Controller 编辑 scope.scene
是否完全正常?那么我的问题是如何打破它的孤立状态?
最佳答案
我会将场景逻辑(包括加载/解析)放入一个自己的服务
中(或多个,一个用于json解析,一个用于旋转等)。我认为 conroller
将 scene
对象传递给 service
没有问题,它不应该包含特定的逻辑,因为它的 Angular 色应该只是在包含逻辑的服务
和 View
之间进行调解。
对于范围界定,我将使用 controller
和 controllerAs
参数实例化指令的 SceneController
(例如),并将场景附加到该指令 Controller
。这样,SceneController
就是一个特定的 Controller
,为场景
提供丰富的 View 和控件。
关于javascript - Angular : controller-directive interaction with separation of concerns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30753814/