2015-10-08 3 views
0

Я пытаюсь изменить свой пользовательский интерфейс (ON LOAD) в зависимости от наличия или отсутствия токена. Я хотел бы показать и скрыть свой логин div и мою форму div на основе наличия или отсутствия токена. По какой-то причине я не могу заставить ng-show работать. Для упрощения задачи я следующее:AngularJS ng-show Не работает?

https://jsfiddle.net/m1q7h9fn/3/

HTML

<div ng-app="nh-launch"> 
    <div ng-show="loginView"> 
     <h1>Login</h1> 
    </div> 

    <div ng-show="formView"> 
     <h1>Form</h1> 
    </div> 
</div> 

JS

angular.module('nh-launch',[]).run(function($scope) { 

var token = "valid"; 

    if (token == "valid") { 
     $scope.loginView = false; 
     $scope.formView = true; 
     $scope.$apply(); 
    } 
    else { 
     $scope.loginView = true; 
     $scope.formView = false; 
     $scope.$apply(); 
    } 

}); 
+0

Читали ли вы ошибку консоли? – Johan

+5

Вам понадобится контроллер ng-controller и соответствующий контроллер в вашем javascript, контролирующий ваш div. В противном случае '$ scope' ничего не значит – Aeolingamenfel

+0

Вот консольная ошибка, которую у меня есть: Uncaught TypeError: Невозможно установить свойство loginView из undefined – shredMER

ответ

3

Изменить пробег на контроллер, как:

angular.module('nh-launch', []).controller('launch-controller', function($scope) { 
 
    /* This run when page load... */ 
 
    $scope.loginView = false; 
 
    $scope.formView = true; 
 
    
 
    $scope.changeView = function() { 
 
     /* This run when click button */ 
 
     $scope.token = ($scope.token == "valid" ? "" : "valid"); 
 
     $scope.loginView = $scope.token == "valid"; 
 
     $scope.formView = $scope.token != "valid"; 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="nh-launch" ng-controller="launch-controller"> 
 
    <button type="button" ng-click="changeView();">Change</button> 
 
    <div ng-show="loginView"> 
 
    <h1>Login</h1> 
 
    </div> 
 

 
    <div ng-show="formView"> 
 
    <h1>Form</h1> 
 
    </div> 
 
</div>

+0

Как я могу изменить это, чтобы он работал на загрузке страницы, а не на кнопку? – shredMER

+0

Контроллеры @shredMER выполняются при загрузке страницы, поэтому, если вы хотите, чтобы функция в контроллере выполнялась при загрузке, вы просто вызываете функцию в нижней части контроллера. – jnthnjns

+1

Посмотрите на мой комментарий в коде –

1

В рамках MVC, таких как AngularJS, модель ($ scope) связана с представлением. Клей, соединяющий два, является контроллером. Вот почему в контроллере должны быть объявлены переменные $scope. Я бы реорганизовать свой код следующим образом

angular.module('nh-launch',[]) 
    .controller('myCtrl', ['$scope', function($scope) { 

     var token = "valid"; 

     if (token == "valid") { 
      $scope.loginView = false; 
      $scope.formView = true; 
      $scope.$apply(); 
     } 
     else { 
      $scope.loginView = true; 
      $scope.formView = false; 
      $scope.$apply(); 
     } 

    }]); 

А затем создать ссылку на контроллер с атрибутом ng-controller. Ваш HTML должен выглядеть следующим образом:

<div ng-app="nh-launch"> 
    <div ng-controller="myCtrl"> 
    <div ng-show="loginView"> 
     <h1>Login</h1> 
    </div> 

    <div ng-show="formView"> 
     <h1>Form</h1> 
    </div> 
    </div> 
</div> 
+0

Хорошо, единственная проблема в том, что я пытаюсь показать и скрыть divs на начальной загрузке. Есть ли способ сделать это с помощью контроллера? Извините, что я новичок в угловом – shredMER

0

Должен быть контроллер, который должен быть связан с View. Таким образом, следующий код поможет вам получить:

<div ng-app="nh-launch"> 
    <div ng-controller="LoginCtrl"> 
     <div ng-show="loginView"> 
      <h1>Login</h1> 
     </div> 

     <div ng-show="formView"> 
      <h1>Form</h1> 
     </div> 
    </div> 
    </div> 
<script> 
    angular.module('nh-launch',[]).controller('LoginCtrl',function($scope) { 

     var token = "valid"; 

     if (token == "valid") { 
      $scope.loginView = false; 
      $scope.formView = true; 
      $scope.$apply(); 
     } 
     else { 
      $scope.loginView = true; 
      $scope.formView = false; 
      $scope.$apply(); 
     } 

    }); 
</script> 
0

вам не нужен отдельный контроллер (хотя вы должны использовать контроллер и объем в реальном мире программы).

Вы можете вводить $rootscope. $scope.$apply не требуется.

Я подправил код https://jsfiddle.net/m1q7h9fn/8/

+0

Ваш пример связывает все с '$ rootScope', если эта страница построена, а все придется переходить на' $ rootScope' или быть отделенной от остальной части кода страницы, которая в конечном итоге находиться в контроллере, прикреплять что-либо к '$ rootScope' не является хорошей практикой. Я бы не рекомендовал кого-нибудь нового для AngularJS избегать контроллеров и приложить все к '$ rootScope' – jnthnjns

+0

да, правильно. Даже я не рекомендую. Пожалуйста, посмотрите мой ответ (хотя вы должны использовать контроллер в реальной программе). – Rabi

+0

Да, я понимаю, что вы говорите, но вы даете ярлык и предлагаете «длинный маршрут».Когда кто-то учится и хочет видеть конечный результат ASAP, они собираются выбрать ярлык, чаще всего. Лично я бы не рекомендовал давать этот совет. Но это только я. – jnthnjns