Раскрывающееся меню AngularJS Toggle

0

Я пытаюсь переключить пункт меню, используя AngularJS. Я пытаюсь понять, что я делаю неправильно, потому что следующее не работает.

<div ng-controller="firstController as firstCtrl">
    <button type="button" class="btn btn-default" aria-label="Menu" ng-click="firstCtrl.toggle(firstCtrl.navOpen)">
        <span class="glyphicon glyphicon-align-left" aria-hidden="true"></span>
    </button>
    <ul ng-show="firstCtrl.navOpen" class="nav nav-pills nav-stacked">
        <li>One</li>
        <li>Two</li>
    </ul>


    <p>{{firstCtrl.test1}}</p>
    <div ng-controller="secondController as secondCtrl">
        <p>{{secondCtrl.test1}}</p>
    </div>
</div>
<script src="app.js"></script>

У меня есть следующий файл app.js. Я использую вложенный контроллер для изучения концепции.

(function () {
var app = angular.module("PHPAngularJSDemo", []);

app.controller("firstController", function () {
    this.test1 = "Sanjay1";
    this.navOpen = false;

    var toggle = function (navOpen) {
        if (navOpen === false) {
            navOpen = true;
        } else
            navOpen = false;
    };

});

//nested controller
app.controller("secondController", function () {
    this.test1 = "Sanjay2";
});

}());

Я создал плунж: http://plnkr.co/edit/xJ3uDK5Mk8xEZY15Odmt?p=info

Теги:

1 ответ

0
Лучший ответ

Проблема в том, что вы передаете firstCtrl.navOpen по значению toggle() а затем манипулируете новой переменной navOpen внутри этой функции, но никогда не привязываетесь к firstCtrl.navOpen которую использует вид.

Ознакомьтесь с документацией для функций Mozilla, которая гласит:

Примитивные параметры (такие как число) передаются функциям по значению; значение передается функции, но если функция изменяет значение параметра, это изменение не отражается глобально или в вызывающей функции.

В вашем случае параметр является логическим, который также является примитивным и, таким образом, передается по значению.

Вы можете заставить свой пример работать как ожидалось, не вызывая функцию вообще, изменяя элемент <button>:

<button class="btn btn-default" aria-label="Menu" type="button" ng-click="firstCtrl.navOpen = !firstCtrl.navOpen">

edit: Я также заметил, что функция toggle также никогда не вызывается в вашем примере, потому что она не является свойством firstController. Для того, чтобы использовать функцию, как у вас есть в вашем примере, то необходимо будет определить в качестве члена this вот так:

this.toggle = function () {
    this.navOpen = !this.navOpen;
};
  • 0
    Спасибо за ваш быстрый ответ. Ваше решение в любом случае более элегантно. Я немного играл, пока учился на практике. Есть ли способ передать по ссылке в функцию? Что, если бы я хотел манипулировать «this.test1» внутри функции, можно ли это сделать?
  • 0
    Еще раз спасибо. Я понимаю первую ценную точку передачи по значению, а не по ссылке, и теперь вы помогли мне понять, как я делал это неправильно при вызове функции. Я пробовал «this.toggle» раньше, но все еще пытался передать переменную по ссылке. С обоими вашими ответами у меня гораздо лучшее понимание того, что я делаю неправильно. Ваша помощь очень ценится.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню