2015-06-10 122 views
0

我有一個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是否完全正常?那麼我的問題是如何將它從隔離中分離出來?

+1

你已經用src設置了一個獨立的作用域,那麼你爲什麼使用attrs.src而不是scope.src?而且,由於您已設置了隔離範圍,控制器將無法更新scope.scene,因爲它無法訪問它。 –

+0

要擴展@AbhishekJain評論,請參閱隔離範圍文檔https://docs.angularjs.org/guide/directive#isolating-the-scope-of-a-directive。從這裏,你在視圖中鏈接2,通過屬性 –

+0

除了我認爲我必須使用'='以外,這不是故意的,所以我可以在一個控制器中有兩個ng-3對象。也許我誤解了教程。 – Paul

回答

1

我會把場景邏輯(包括加載/解析)放到自己的service(或多個,一個用於json解析和一個用於旋轉等)。我發現conrollerscene對象傳遞給service沒有問題,它應該不包含特定的邏輯,因爲它的作用應該是在包含邏輯的serviceview之間調解。

對於作用域,我會實例化一個SceneController(例如)用於與所述controllercontrollerAs參數的指令和場景附加到controller。這種方式SceneController是一個特定的controllerscene提供豐富的觀點和控制。