Une variable objet fonctionne en raison de la manière dont l'héritage prototypique JavaScript fonctionne. ngInclude crée son propre champ d'application enfant. Cette portée enfant hérite prototypiquement de la portée parent.
En JavaScript, lorsque nous écrivons quelque chose comme $scope.x = 22
dans un champ d'application enfant, cela crée un champ d'application x
sur l'enfant $scope et lui assigne la valeur 22 -- la chaîne de prototypes n'est pas consultée ici, donc le parent $scope ne voit pas ce qui s'est passé.
Lorsque nous écrivons quelque chose comme $scope.someObj.prop1 = 22
sur le champ d'application enfant, si JavaScript ne trouve pas le champ d'application someObj
sur le $scope enfant, il consulte la chaîne de prototypes, et le $scope suivant dans la chaîne est le $scope parent. Si le someObj
existe sur le $scope parent, alors le $scope parent est modifié.
Comme je l'ai mentionné dans un commentaire, la question et la réponse suivantes de l'OS expliquent tout cela de manière beaucoup plus détaillée (avec de nombreuses photos) : Quelles sont les nuances de l'héritage prototypique / scope prototypical dans AngularJS ?