0

index.htmlЧто именно это означает в контроллере AngularJS?

<body ng-controller="StoreController as s"> 
    <h1 ng-click="s.changeValFunc()">{{s.carname}}</h1> 
    <h2>{{s.carname}}</h2> 
    </body> 

app.js

var app = angular.module('store', []); 
app.controller('StoreController', function() { 
    this.carname = "Volvo"; 
    this.changeValFunc = function(){ 
     this.carname="BMW"; 
    } 
}); 

При нажатии на кнопку на h1 изменения тегов {{carname}} как для h1 и h2 на BMW. Разве это не «это» относится к клику текущего элемента. Не понимаю, как свойства контроллера разделяются между представлениями.

+0

Возможный дубликат [Как "это" ключевое слово работы?] (Http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) –

ответ

2

Функция контроллера создается с помощью new. Это означает, что он работает так:

function StoreController() { 
    this.carname = "Volvo"; 
    this.changeValFunc = function() { 
     this.carname="BMW"; 
    } 
}; 

var s = new StoreController(); 

console.log(s.carname); // Volvo 

s на ваш взгляд, является ссылкой на реализованным StoreController, который имеет те атрибуты, потому что вы их там в функции конструктора. Возможно, вы захотите увидеть How does the "this" keyword work?.

+0

Спасибо за ссылку. Сообщение было полезно. – mustafa1993

1

В вашем случае это относится к самому контроллеру.

Таким образом, любой атрибут в этом контроллере можно получить доступ с

this.attribute 

В вашем случае «назначить» контроллер для родительского элемента

<body ng-controller="StoreController as s"> 

Это означает, что вы создаете экземпляр StoreController для тела элемента.

Изменение атрибута carname вы меняете его для всего контроллера.

Если вы знаете немного программирования OO, вы можете видеть контроллер как класс, и с этим вы ссылаетесь на экземпляр класса.

Это верно для вашего случая, в javascript этот иногда имеет какое-то странное поведение.

Как говорится в deceze, вы можете взглянуть на некоторые сообщения, которые объясняют, как это работает в JS.

надеюсь, что это помогает

+0

Да, я понял. Благодарю. Именно в программировании OO мы говорим о новом конструкторе, принадлежащем классу. Здесь у нас есть только функция. Где класс подходит здесь? – mustafa1993

+1

@mustafa Javascript не имеет классов, он имеет только объекты и функции. Поведение «класса» реализуется с поведением «этого» и «нового» ключевых слов и «прототипа». Это как «OO» как класс OO, возможно, даже более того, поскольку * все * является объектом. Это не подходящее место для расширения, хотя, об этом уже достаточно обсуждается. – deceze

+0

Да, теперь я знаю, что искать по этому поводу. – mustafa1993

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