2014-01-31 3 views
0

я запутался, читая статью с этого сайта (ловушкой # 5):трудно понять, вложенную область в AngularJs

http://thenittygritty.co/angularjs-pitfalls-using-scopes

http://jimhoskins.com/2012/12/14/nested-scopes-in-angularjs.html

Мой вопрос:

  1. - это сценарий, похожий на две переменные с одним и тем же именем в простых js, один из которых определяется локально (например, внутри вложенной функции) и на е, определяемой глобально (например, windows.onload), поэтому локальная всегда переопределяет глобальную?

  2. Я понимаю, что $ scope.variable должен ссылаться на модель, которая содержит значения, но на самом деле это не влияет на результат, если они имеют одно и то же имя, независимо от наличия точечного синтаксиса. Я не понимаю, если поставить «.». точка приведет к различию в ВЫХОДНОЙ ЗНАЧЕНИИ выше. Например, заменив их {{user.name}}. Как эта лучшая практика работает?

Следующий код с сайта пытается demostrate, если 2-й {{имя пользователя}} изменений, первый {{имя пользователя}} не изменится.

Html:

<span>Outside Controller: Your name is: {{username}}</span> 
<div ng-controller="SignupController"> 
    <span>Inside Controller: Your name is: {{username}}</span> 
    <fieldset legend="User details"> 
    <input ng-model="username" /> 
    </fieldset> 
</div> 

JS:

var app = angular.module('app', []); 
app.controller('SignupController', function($scope){}); 
+1

По-прежнему нет лучшего объяснения концепции наследования сферы, что эта wiki https://github.com/angular/angular.js/wiki/Understanding-Scopes – Chandermani

ответ

2

Он работает как прототипное наследование в JavaScript.

function Jedi(){} 
Jedi.prototype.name = 'Luke'; 

Теперь, если вы сделаете это:

var obiwan = new Jedi(); 
console.log(obiwan.name); //Luke 

Однако, если я это сделать:

var obiwan = new Jedi(); 
obiwan.name = 'Obi-wan'; 
console.log(obiwan.name); //Obi-wan 

var luke= new Jedi(); 
console.log(luke.name); //Luke 

Это то, как свойства JavaScript Разрешая. Когда вы читаете свойство, он сначала ищет его в объекте, если его не найти, он просматривает его в прототипе, если его не обнаружено, он выглядит в прототипе прототипа и так далее, пока он не достигнет вершины цепи прототипа (если не найден).

Однако при записи свойства, если объект еще не имеет данного поля, он создается и с этого момента в соответствии с критериями поиска, описанными выше, значение, которое вы получаете при чтении, является тем, что непосредственно в объект, а не его прототип.

Решение, предлагаемое в угловом режиме, заключается в том, чтобы хранить данные модели не как поля в области видимости, а как объекты, чтобы избежать такого поведения. Например:

function Jedi() 
Jedi.protype.data = {name: 'Luke'}; 

var obiwan = new Jedi(); 
obiwan.data.name = 'Obi-wan'; 

var luke= new Jedi(); 
console.log(luke.data.name); //Obi-wan 

На этот раз поле под прототипным наследованием data, и поэтому все объекты поделиться.

+0

Я начинаю получать связь между вашим примером и областью Angularjs наследование.Как ни странно, я пропустил ваш пример, изучая Js Oop, что вы не можете изменить его, если они являются примитивными значениями, однако это возможно, когда свойство prototype является объектом. Думаю, единственная причина, по которой вы можете изменить свойство прототипа, заключается только в том, что .data указывает на объект (т. Е. Ссылку, хранящуюся в стеке)? – Charles

+0

Книга [Профессиональный JavaScript для веб-разработчиков] (http://www.amazon.com/Professional-JavaScript-Developers-Nicholas-Zakas/dp/1118026691/ref=sr_1_1?ie=UTF8&qid=1391168315&sr=8-1&keywords=professional + javascript + для + web + разработчиков) имеют лучшие объяснения, которые я когда-либо читал по этому вопросу. Посмотрите, можете ли вы получить копию. И да, в моем последнем примере оба объекта используют ссылку на тот же экземпляр 'data', что наиболее вероятно в области памяти кучи (маловероятно в стеке). –

+0

Ур прямо на куче. Вернемся к моему последнему комментарию. Из-за этого теперь имеет место угловое пространство. Благодарю. – Charles

Смежные вопросы