2016-11-13 32 views
1

我是Angularjs中的新成員,我有一個應用程序,其中包含一些「項目」,在某些頁面上顯示本地菜單。 的Index.html包含主導航欄與頁腳:Angularjs嵌套控制器被稱爲一次

<body ng-app="ysi-app" ng-controller="MainController"> 
<div class="page-content"> 
<div class="row"> 
    <div class="col-md-2"> 
     <div class="sidebar content-box" style="display: block;"> 
      <ul class="nav"> 
       <!-- Main menu --> 
       <li ng-if="isAuthenticated()"><a href="#/">{{name}}</a></li> 
       <li class="current"><a href="index.html">Dashboard</a></li> 
       <li><a href="#/project">Projects</a></li> 
      </ul> 
     </div> 
     <div ng-if="isAuthenticated() && displayProjectMenu == true" ng-include="'views/localMenu.html'" ng-controller="LocalMenuController"> 
     </div> 
    </div> 
    <div ng-view></div> 
</div> 

所以我有一個嵌套的控制器本地菜單和主控制器LocalMenuController。該項目控制器將DATAS:

angular.module('ProjectCtrl',[]).controller('ProjectController',function($scope,$location, ProjectService,$route, AuthenticationService, $rootScope){ 

    $scope.setProjectDatas = function(projectName, projectId){ 
     ProjectService.setName(projectName); 
     $rootScope.projectId = projectId; 
    };}); 

我一個項目的ID設置爲$ rootScope測試(我有一個服務,這將做到這一點更好),並把它在LocalMenuController

angular.module('LocalMenuCtrl',[]).controller('LocalMenuController', function($scope, ProjectService, $rootScope) { 
    $scope.projectId = ''; 
    $scope.projectId = $rootScope.projectId; 
}); 

我在一個表中顯示的項目,當我點擊它的一個,功能setProjectDatas(姓名,身份證)被調用。問題是當我點擊一個項目時,項目的ID是正確的並且設置了,但是當我上一次並單擊另一個項目時,ID是以前點擊的項目的舊ID。數據沒有更新。我搜索了我的問題,但沒有發現任何問題。
我認爲LocalMenuController被稱爲只有一次,但不是之後。

我在做什麼錯?

謝謝

UPDATE
我已經創建,顯示該模板的指令,但它仍然沒有更新局部視圖localMenu。 LocalMenu指令

angular.module('LocalMenuCtrl',[]).controller('LocalMenuController', function($scope, ProjectService, $rootScope) { 
    console.log('-> LocalMenu controller'); 
}) 
    .directive('localMenu', function($rootScope){ 
     return { 
      templateUrl: '/YSI-Dev/public/views/partials/localMenu.html', 
      link: function(scope){ 
       scope.projectId = $rootScope.projectId; 
      } 
     }; 
    }); 

的index.html

<div ng-if="isAuthenticated() && displayProjectMenu == true" ng-controller="LocalMenuController"> 
       <div local-menu></div> 
      </div> 

局部視圖localMenu的一部分:

<div class="sidebar content-box" style="display: block;"> 
    <ul class="nav"> 
     <li><a href="#/project/{{projectId}}"><i class="glyphicon glyphicon-list-alt"></i> Backlog</a></li> 
     <li><a href="#/project/{{projectId}}/members"><i class="glyphicon glyphicon-user"></i> My team </a></li> 
    </ul> 
</div> 

我試圖讓專案編號從$ rootScope注入並注入<a href="#/project/{{projectId}}"但我有一些麻煩。有什麼辦法做到這一點?

回答

1

首先,嘗試使用directives而不是ng-controller。你可以將你的代碼和模板封裝到一個單元中。您也可以嘗試創建一個component。將一些數據傳遞給指令/組件,Angular將負責更新模板並運行在指令/組件內運行的任何需求。 (鑑於您使用雙向數據綁定)

從上面的代碼,我看不到什麼會觸發LocalMenuController再次運行。

+0

我創建了一個指令,但仍然無法工作。我已經更新了我的帖子,但這是否正確嗎? – timp

+1

向指令引入一個名爲projectId的屬性,並在模板中添加project-id =「projectId」,不太可能需要使用$ rootScope來共享數據。 – norbertk

+0

是的,謝謝你,它完美的作品! – timp