Perdre portée lors de l'utilisation de ng-inclure
J'ai ce module routes:
var mainModule = angular.module('lpConnect', []).
config(['$routeProvider', function ($routeProvider) {
$routeProvider.
when('/home', {template:'views/home.html', controller:HomeCtrl}).
when('/admin', {template:'views/admin.html', controller:AdminCtrl}).
otherwise({redirectTo:'/connect'});
}]);
Maison HTML:
<div ng-include src="views.partial1"></div>
partial1
HTML:
<form ng-submit="addLine()">
<input type="text" ng-model="lineText" size="30" placeholder="Type your message here">
</form>
HomeCtrl
:
function HomeCtrl($scope, $location, $window, $http, Common) {
...
$scope.views = {
partial1:"views/partial1.html"
};
$scope.addLine = function () {
$scope.chat.addLine($scope.lineText);
$scope.lines.push({text:$scope.lineText});
$scope.lineText = "";
};
...
}
Dans le addLine
fonction $scope.lineText
est undefined
, ce problème peut être résolu par l'ajout d' ng-controller="HomeCtrl"
à partial1.html
, cependant, il provoque le contrôleur à être appelé deux fois. Ce qui me manque ici?
Vous devez vous connecter pour publier un commentaire.
C'est à cause de
ng-include
qui crée un nouvel enfant, de sorte$scope.lineText
n'est pas modifiée. Je pense quethis
se réfère à l'étendue actuelle, de sortethis.lineText
doit être définie.Comme @Renan mentionné, ng-inclure crée un nouvel enfant. Ce champ fait hérite (voir les lignes en pointillés ci-dessous) à partir de la HomeCtrl portée.
ng-model="lineText"
crée en fait une primitive de la portée de propriété sur l'enfant, pas HomeCtrl du champ d'application. Cet enfant n'est pas accessible pour le parent/HomeCtrl portée:Pour stocker ce que l'utilisateur a tapé dans HomeCtrl de dollars de portée.les lignes de tableau, je vous suggère de passer la valeur de la addLine fonction:
En outre, depuis lineText est la propriété de la ngInclude portée/partiel, je pense qu'il devrait être responsable de la compensation d'elle:
Fonction addLine() deviendrait ainsi:
Violon.
Alternatives:
ng-model="someObj.lineText
; violonlineText
bien sur la HomeCtrl $champ d'application:ng-model="$parent.lineText"
; violonC'est un peu à expliquer pourquoi les deux alternatives de travail, mais il est entièrement expliquée ici: Quelles sont les nuances de portée prototypes /l'héritage par prototype dans AngularJS?
Je ne recommandent pas l'utilisation de
this
dans le addLine() fonction. Il devient beaucoup moins clair dont la portée est en cours d'accès/manipulé.$parent.
et il a très bien fonctionné. Pourquoi ne vous considérez que c'est un hack? (Je peux voir, il ajoute de la maintenance, si vous refait votre html)$parent.$parent...
pour le faire fonctionner. Mettre une autre manière, à l'aide de$parent
fait des hypothèses sur les DOM de la structure.this
se sent comme un hack Angulaire termesAu lieu d'utiliser
this
que l'on a accepté de répondre à l'indique, l'utilisation$parent
à la place. Donc, dans votrepartial1.html
vous aurez:Si vous voulez en savoir plus sur la portée de
ng-include
ou par d'autres directives, check this out: https://github.com/angular/angular.js/wiki/Understanding-Scopes#ng-include$scope.$parent
au lieu de$parent
est pas défini selon Angulaire.$scope.$parent
qui fonctionne pour moi angulaire 1.3.20J'ai trouvé comment contourner ce problème sans mélange parent et sous la portée de données.
Définir un
ng-if
sur leng-include
élément et de le définir sur une étendue variable.Par exemple :
Dans votre contrôleur, lorsque vous avez réglé toutes les données dont vous avez besoin dans votre sous-champ d'application, puis les mettre de montrer à
true
. Leng-include
copie en ce moment, l'ensemble de données dans votre périmètre et de le fixer dans votre sous-portée.La règle de base est de réduire la portée de données plus profond de la portée sont, sinon vous avez cette situation.
Max