2017-09-19 5 views
0

Il semble que je perds de la portée sur mon contrôleur angulaire lorsque j'essaie d'abstraire mes modules Angularjs.Perdre de la portée entre les modules angulaires en utilisant ng-view

Cela fonctionne très bien si j'utilise mon module d'application, mais dès que je change le module home.js en app.layout, $ scope ne fonctionne plus.

Quelqu'un peut-il repérer un problème ici?

_Layout.html (à gauche sur la tête et comprend)

<body class="docs-body" ng-app="app"> 
<div layout="column" ng-cloak> 
    <section layout="row" flex> 
     <div ng-include="'App/layout/sidenav.html'"></div> 
     <md-content class="_md layout-column flex" layout="column" flex=""> 
      <div ng-include="'App/layout/toolbar.html'"></div> 
      <div class="container body-content"> 
       @RenderBody() 
      </div> 
     </md-content> 
    </section> 
</div> 
</body> 

@RenderBody() amène à Index.html

<!-- this is where content will be injected --> 
<div ng-view></div> 

Home.html

<div> 
<h1>Home Page</h1> 
<p>{{ message }}</p> 
</div> 

Mon application. js

angular. 
.module('app', [ 
     'app.core', 
     'app.layout', 
    ]); 

})();

layout.module.js

(function() { 
'use strict'; 

angular.module('app.layout', [ 
    'ngAnimate', 
    'ngMaterial', 
    'ngAria' 
]); 

})();

core.module.js

(function() { 
'use strict'; 

angular.module('app.core', [ 
    'ngRoute' 
]); 

})();

et route.js:

angular.module('app.core') 
    .config(function ($routeProvider, $locationProvider) { 
     $routeProvider 

     // route for the home page 
     .when('/', { 
      templateUrl: 'App/layout/home.html', 
      controller: 'home' 
     });// End routeprovider 
    })// end config 

Enfin le coupable ... Home.js

(function() { 
'use strict'; 

console.log('registering controller home before Angular'); 

angular 
    .module('app.layout') 
    .controller('home', home); 

home.$inject = ['$scope']; 

function home($scope) { 
    console.log('registering controller home'); 
    // create a message to display in our view 
    $scope.message = 'Everyone come and see how good I look!'; 
} 

})();

Maintenant, quand je

.module('app); 
.controller('home', home); 

sur home.js, les scope.message $ affiche

'Everyone come and see how good I look!' 

mais si j'ai

.module('app.layout') 
.controller('home', home); 

il affiche

{{message}} 

Je sais que je suis en train de perdre la portée d'une manière ou d'une autre ici, mais je n'arrive pas à trouver une solution! Ai-je besoin de déclarer à nouveau le contrôleur en dehors du routeur?

Répondre

0

Je pense que Angular ne peut pas obtenir votre contrôleur home. Vous devez injecter app.layout dans le module app.core.

angular.module('app.core', ['app.layout']) 
    .config(function ($routeProvider, $locationProvider) { 
     $routeProvider 

     // route for the home page 
     .when('/', { 
      templateUrl: 'App/layout/home.html', 
      controller: 'home' 
     });// End routeprovider 
    })// end config 


angular. 
.module('app.layout',[]).controller(); 
+0

J'ai essayé d'injecter app.layout dans le module principal, mais il ne construit toujours pas le contrôleur lorsque je débogue. J'ai également essayé d'injecter le noyau dans la mise en page mais il ne le construit toujours pas. Il semble que je ne puisse pas accéder au contrôleur de la maison, mais j'essaie toujours de comprendre les dépendances sur les modules et comment accéder aux autres entre chaque module. – cptHoek

+0

avez-vous vu l'erreur dans la console? –

+0

Dit le contrôleur avec le nom «maison» n'est pas enregistré, ce qui est logique voir comment il ne peut pas le construire – cptHoek

0

La solution était plutôt frustrante. À l'aide de la configuration Bundle de Visual Studio, il ajoutait le fichier home.js avant de compiler les fichiers du module. Ce faisant, quand il a essayé de construire et enregistrer le contrôleur, il n'a pas pu trouver le module.La solution consistait à construire d'abord tous les modules puis à construire des contrôleurs en spécifiant l'ordre de construction dans la configuration du bundle.