Подтвердить что ты не робот

AngularJS: ng - если не работает в сочетании с ng-click?

Учитывая этот тестовый пример, используя AngularJS 1.2 rc3: http://plnkr.co/edit/MX6otx (повторяется ниже)

1.

<li ng-init="toggle1 = false">
    ng-if toggle1: {{ toggle1 }}
    <p>
        <button ng-if="!toggle1" ng-click="toggle1 = true">Turn On</button>
        <button ng-if="toggle1" ng-click="toggle1 = false">Turn Off</button>
        does not work
</li>

2.

<li ng-init="obj={toggle2:false}">
    ng-if obj.toggle2: {{ obj.toggle2 }}
    <p>
        <button ng-if="!obj.toggle2" ng-click="obj.toggle2 = true">Turn On</button>
        <button ng-if="obj.toggle2" ng-click="obj.toggle2 = false">Turn Off</button>
        then why does this work?
</li>

Вопросы:

  • Почему 1 не работает?
  • Должен ли я работать?
  • Почему работает 2?
  • Должны ли 2 работать?
  • Могу ли я полагаться 2 на работу в будущих обновлениях AngularJS?
4b9b3361

Ответ 1

  • Почему 1 не работает?:. Поскольку ngIf определяет свою собственную область, которая прототипна наследует от родительской области (точно так же, как ngRepeat). Итак, когда вы изменяете значение поля внутри ngIf, вы меняете его в области ngIf, а не в его родительской области.
  • Должен ли 1 работать?: Нет
  • Почему работают 2?:. В этом случае вы изменяете содержимое объекта, на который ссылается область ngId, через наследование.
  • Должны ли 2 работать?: Да
  • Могу ли я полагаться на 2 в будущих обновлениях AngularJS?: Почему бы вам не быть?

Этот механизм наследования сферы очень хорошо объясняется в https://github.com/angular/angular.js/wiki/Understanding-Scopes

Ответ 2

Так как ngIf создает собственную область видимости, для ее работы вы можете определить toggle1 в одной области:

JS **

$scope.toggleMe = function(){
     $scope.toggle1 = !$scope.toggle1;
    }

HTML

<li ng-init="toggle1 = true">
        ng-if toggle1: {{ toggle1 }}
        <p>
            <button ng-if="toggle1"  ng-click="toggleMe()">Turn On</button>
            <button ng-if="!toggle1"  ng-click="toggleMe()">Turn Off</button>
            does not work
    </li>

См. демонстрацию Plunker

Ответ 3

1. Почему 1 не работает?
ng-if создает новую область. который вызывает "странное" поведение привязки, как описано в этом видео: http://egghead.io/lessons/angularjs-the-dot

2. Должен ли я работать?
Чтение свойств из родительской области действия (цепочка прототипов), но запись в область создает новое свойство в области дочерних объектов. Создание отключенного

3. Почему 2 работают?
То же свойство считывается из родительской области (obj). Запись в ng-click изменяет объект obj, а не область.

4/5. Должны ли 2 работать? Могу ли я полагаться на 2, чтобы работать в будущих обновлениях AngularJS?
ДА, это документированное ожидаемое поведение.

Совет: Я использую расширение Chrome AngularJS Batarang, чтобы получить представление о том, какие переменные находятся в этой области.