2015-06-10 11 views
0

У меня есть модуль 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? Тогда мой вопрос: как я могу вырваться из изоляции?

+1

Вы создали изолированную область с помощью src, так почему вы используете attrs.src, а не scope.src? И поскольку вы настроили изолированную область действия, контроллер не сможет обновить scope.scene, поскольку у него нет доступа к нему. –

+0

Чтобы увеличить комментарий @AbhishekJain, вот документация для выделения области https://docs.angularjs.org/guide/directive#isolating-the-scope-of-a-directive. Отсюда вы связываете 2 вместе в представлении с помощью атрибутов –

+0

Это не было намеренно, кроме того, что я думал, что должен использовать '=', поэтому я могу иметь два нг-три объекта внутри одного контроллера. Возможно, я неправильно понял учебник. – Paul

ответ

1

Я бы поставил сценарную логику (включая загрузку/синтаксический анализ) в собственный service (или несколько, один для json-синтаксического анализа и один для вращения и т. Д.). Я не вижу проблемы с conroller, передавая объект scene на service, он должен просто не содержать в себе конкретной логики, поскольку его роль должна заключаться только в посредничестве между service с логикой и view.

Для определения объема, я бы экземпляр SceneController (например) для директивы с параметрами controller и controllerAs и прикрепить сцену к этому controller. Таким образом, SceneController является конкретным controller, чтобы обеспечить богатый вид и элементы управления для scene.