У меня есть модуль AngularJS, который определяет красивую директиву, которая может отображать сцену WebGL из атрибута scr="filename"
. Это хорошо работает, и (пропущено здесь и там) выглядит примерно так:Угловое: взаимодействие с контроллером с разделением проблем
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 вместе в представлении с помощью атрибутов –
Это не было намеренно, кроме того, что я думал, что должен использовать '=', поэтому я могу иметь два нг-три объекта внутри одного контроллера. Возможно, я неправильно понял учебник. – Paul