Ответ 1
Update:
Благодаря ссылке на это сообщение в блоге мне нужно обновить свой ответ. Поскольку AngularJS 1.4 действительно кажется, что вы можете использовать
scope: {},
bindToController: {
variable: '='
}
который будет делать (точную) ту же самую вещь, что и старый синтаксис:
scope: {
variable: '='
},
bindToController: true
Полезные строки исходного кода AngularJS для объяснения этого поведения:
if (isObject(directive.scope)) {
if (directive.bindToController === true) {
bindings.bindToController = parseIsolateBindings(directive.scope,
directiveName, true);
bindings.isolateScope = {};
} else {
bindings.isolateScope = parseIsolateBindings(directive.scope,
directiveName, false);
}
}
if (isObject(directive.bindToController)) {
bindings.bindToController =
parseIsolateBindings(directive.bindToController, directiveName, true);
}
Источник: AngularJS 1.4.0
Оригинальный ответ:
Надеюсь, я могу объяснить вам, почему это поведение вы испытали правильно и где вы пропустили понимание концепции привязки сферы.
Позвольте мне объяснить, что вы сделали в своем первом фрагменте кода:
.directive('mdAddress', function mdAddress() {
var directive = {
restrict: 'EA',
scope: {},
bindToController: {
address: '='
},
templateUrl: 'modules/address/address.html',
controller: AddressController,
controllerAs: 'dir'
};
С помощью scope: {}
вы создали изолированную область (без какого-либо наследования) для вашей директивы mdAddress
. Это означает: данные не передаются между родительским контроллером и вашей директивой.
Имея это в виду, относительно второго фрагмента кода:
<md-address address="vm.address"></md-address>
vm.address
из вашего родительского контроллера/представления будет назначаться как выражение для атрибута адреса директивы, но поскольку вы ранее определяли изолированную область, данные не передаются в AddressController
и, следовательно, недоступны в bindToController
.
Давайте рассмотрим определение объекта scope
как "какие данные будут переданы" и bindToController
как "какие данные будут доступны в моем объекте controllerAs как объект".
Итак, теперь давайте посмотрим на последний (и фрагмент рабочего кода):
.directive('mdAddress', function mdAddress() {
var directive = {
restrict: 'EA',
scope: {
address: '='
},
bindToController: true,
templateUrl: 'modules/address/address.html',
controller: AddressController,
controllerAs: 'dir'
};
Здесь вы создали изолированную область, но на этот раз вы добавили атрибут address
, который будет передан как выражение. Итак, теперь address
, который вы передали из представления во втором фрагменте, будет доступен в области контроллера. Теперь установка bindToController: true
свяжет все текущие свойства области с контроллером (или, скорее, объект controllerAs). И теперь это работает так, как вы ожидаете, потому что данные будут переданы в область и данные будут переданы в область шаблонов контроллера.
Этот краткий обзор поможет вам лучше понять концепцию объектов определения scope
и bindToController
?