javascript - showing - ng-include example html
Perder alcance al usar ng-include (4)
Como se menciona @Renan, ng-include crea un nuevo alcance para el niño. Este ámbito hereda de manera prototípica (ver líneas discontinuas a continuación) desde el alcance de HomeCtrl. ng-model="lineText"
realmente crea una propiedad de ámbito primitivo en el ámbito hijo, no en el ámbito de HomeCtrl. Este ámbito hijo no es accesible para el alcance principal / HomeCtrl:
Para almacenar lo que el usuario tipeó en la matriz $ scope.lines de HomeCtrl, le sugiero que pase el valor a la función addLine:
<form ng-submit="addLine(lineText)">
Además, dado que lineText es propiedad de ngInclude scope / partial, creo que debería ser responsable de borrarlo:
<form ng-submit="addLine(lineText); lineText=''''">
La función addLine () se convertiría así:
$scope.addLine = function(lineText) {
$scope.chat.addLine(lineText);
$scope.lines.push({
text: lineText
});
};
Fiddle .
Alternativas:
- define una propiedad de objeto en $ scope de HomeCtrl, y usa eso en el parcial:
ng-model="someObj.lineText
; fiddle - no recomendado, esto es más un hack: use $ parent en la propiedad partial para crear / acceder a
lineText
en el alcance de HomeCtrl $:ng-model="$parent.lineText"
; fiddle
Es un poco complicado explicar por qué las dos alternativas anteriores funcionan, pero se explica completamente aquí: ¿Cuáles son los matices del alcance de la herencia prototípica / prototípica en AngularJS?
No recomiendo usar this
en la función addLine (). Se vuelve mucho menos claro a qué alcance se accede / manipula.
Tengo este módulo de rutas:
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''});
}]);
HTML casero:
<div ng-include src="views.partial1"></div>
HTML partial1
:
<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 = "";
};
...
}
En la función addLine
$scope.lineText
undefined
está undefined
, esto puede resolverse agregando ng-controller="HomeCtrl"
a partial1.html
, pero hace que el controlador se llame dos veces. ¿Que me estoy perdiendo aqui?
En lugar de usar this
como lo sugiere la respuesta aceptada, use $parent
en $parent
lugar. Entonces en tu partial1.html
tendrás:
<form ng-submit="$parent.addLine()">
<input type="text" ng-model="$parent.lineText" size="30" placeholder="Type your message here">
</form>
Si desea obtener más información sobre el alcance en ng-include
u otras directivas, consulte esto: https://github.com/angular/angular.js/wiki/ ng-include
Esto se debe a ng-include
que crea un nuevo ámbito hijo, por lo que $scope.lineText
no se cambia. Creo que this
refiere al alcance actual, por this.lineText
que se debe establecer this.lineText
.
He descubierto cómo solucionar este problema sin mezclar los datos principales y secundarios. Establezca ng-if
en el elemento ng-include
y establézcalo en una variable de ámbito. Por ejemplo :
<div ng-include="{{ template }}" ng-if="show"/>
En su controlador, cuando haya configurado todos los datos que necesita en su subámbito, configure show en true
. El ng-include
copiará en este momento el conjunto de datos en su alcance y lo establecerá en su subámbito.
La regla de oro es reducir los datos de alcance más profundo del alcance, de lo contrario, tiene esta situación.
Max