我有一个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
是否完全正常?那么我的问题是如何将它从隔离中分离出来?
你已经用src设置了一个独立的作用域,那么你为什么使用attrs.src而不是scope.src?而且,由于您已设置了隔离范围,控制器将无法更新scope.scene,因为它无法访问它。 –
要扩展@AbhishekJain评论,请参阅隔离范围文档https://docs.angularjs.org/guide/directive#isolating-the-scope-of-a-directive。从这里,你在视图中链接2,通过属性 –
除了我认为我必须使用'='以外,这不是故意的,所以我可以在一个控制器中有两个ng-3对象。也许我误解了教程。 – Paul