2015-09-07 2 views
2

в основном моя проблема в том, что у меня есть мнение AngularJS (home.html), который содержит переменный в двойных квадратных скобках, например: {{сообщение}}AngularJS View не обновляется, когда переменные переменной Controllers изменены?

Когда переменный $ scope.message модифицируется, вид с делает не обновлять, хотя это должно быть? Я попробовал добавить $ scope. $ Apply(), которая приводит к исключению в соответствии с строкой «Действующее действие»

Проверьте мой код ниже. Часть {{message}} в home.html не обновляется при вызове $ scope.doLogin в MainCtrl, хотя я задал $ scope.message новое значение в этой функции.

Любая помощь очень ценится, и если вам нужна дополнительная информация, пожалуйста, спросите.

index.html

<!DOCTYPE html> 

<html ng-app="myApp"> 
<head> 

    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 

    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"> 
    <link href="stylesheet.css" rel="stylesheet"> 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 

    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.4/angular.min.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.4/angular-route.min.js"></script> 
    <base href="/"> 

    <script src="https://cdnjs.cloudflare.com/ajax/libs/ngStorage/0.3.9/ngStorage.js"></script> 
    <script src="https://cdn.socket.io/socket.io-1.3.5.js"></script> 

</head> 
<body> 

    <div ng-controller="MainCtrl"> 
     <nav class="navbar navbar-default"> 
      <div class="container"> 
       <div class="navbar-header"> 
        <a class="navbar-brand" href="#">TriviaAttack</a> 
       </div> 
       <div id="navbar" class="navbar-collapse collapse"> 
        <form id="loginForm" class="navbar-form navbar-right"> 
         <div class="form-group"> 
          <input type="text" placeholder="Email" class="form-control" ng-model="loginData.username"> 
         </div> 
         <div class="form-group"> 
          <input type="text" placeholder="Password" class="form-control" ng-model="loginData.password"> 
         </div> 
         <div class="form-group"> 
          <button type="submit" class="btn btn-success" ng-click="doLogin()">Sign In</button> 
         </div>     
        </form> 
       </div> 
      </div> 
     </nav> 
    </div> 

    <div ng-view> 

    </div> 
    </div> 

    <script src="./app/app.js"></script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"> 

</body> 
</html> 

home.html

<div> 
    <h1>Welcome to the Home Page</h1> 
    <p>{{message}}</p> 
</div> 

app.js

var myApp = angular.module('myApp',['ngRoute', 'ngStorage']); 

myApp.controller('MainCtrl', ['$rootScope', '$scope', '$location', 
    function($rootScope, $scope, $location) { 

    $scope.message = 'testing message'; 

    $scope.loginData = { 
     username: '', 
     password: '', 
     loggedIn: false 
    } 

    $scope.doLogin = function() { 

     $scope.message = 'message changed!'; 
     $scope.$apply(); 

     Auth.doLogin($scope.loginData.username, $scope.loginData.password) 
     .success(function(data) { 
      if (data.success) { 
       AuthToken.setToken(data.token); 
       $location.path('/home'); 
       console.log($scope.loginData.loggedIn); 
      } 
     }); 

     $scope.loginData = {}; 
    } 

}]); 

//Middleware for all requests which adds the users token to the HTTP header. 
myApp.factory('TokenInterceptor', ['$q', '$location', '$localStorage', 
    function($q, $location, $localStorage) { 

    //On each request, check if the user is logged in with a valid token. 
    var interceptor = { 
     request: function(config) { 

      config.headers['X-Authorization-Token'] = $localStorage.token; 
      return config; 

     }, 
     responseError: function(response) { 
      if(response.status === 401 || response.status === 403) { 
       $location.path('/login'); 
      } 
      return $q.reject(response); 
     } 
    }; 
    return interceptor; 
}]); 

myApp.config(['$routeProvider','$locationProvider','$httpProvider', 
    function($routeProvider, $locationProvider, $httpProvider) { 

     $routeProvider. 
      when('/', { 
       templateUrl: './app/views/landingpage.html', 
       controller: 'MainCtrl' 
      }). 
      when('/home', { 
       templateUrl: './app/views/home.html', 
       controller: 'MainCtrl' 
      }). 
      otherwise({ 
       redirectTo: '/' 
      }); 


     $locationProvider.html5Mode(true); 

     $httpProvider.interceptors.push('TokenInterceptor'); 

    } 

]); 

console.log('app.js loaded!'); 
+0

Все ваши взгляды используют собственный 'MainCtrl' и имеют свою собственную' $ scope', поэтому, когда вы вызываете 'doLogin' из формы входа в систему, он будет обновлять« сообщение »только в своей области, а не в контроллере 'ng-view'. – user2718281

+0

Привет, так что я пытаюсь сделать, это невозможно? Или какое ваше предложенное решение. Я благодарен вам за ответ. –

+0

См. [Угловое: обмен данными между контроллерами] (http://stackoverflow.com/questions/21919962/angular-share-data-between-controllers). Вкратце верните объект с завода и отработайте его в контроллерах. Сообщите нам, если это не поможет. – user2718281

ответ

1

Проблема заключается в освещении контроллера

<div ng-controller="MainCtrl"> 
    <!--omitted--> 
</div> 
<div ng-view></div> 

Ваш $ scope.message плотно к вашему MainCtrl, так что, когда ng-view заселен, то кроме того, что он имеет MainCtrl, но на самом деле это за пределами этого DIV, так что просто не видит, что переменная, чтобы заставить его работать, вставить нг ракурс к MainCtrl DIV, как показано ниже

<div ng-controller="MainCtrl"> 
    <!--omitted--> 
    <div ng-view></div> 
</div> 

Но вот актуальная проблема

Вы склонны использовать нг-маршрут, но у вас нет какой-либо конфигурации маршрутов, ng-view никогда не будет заполняться с home.html, если вы не настроите вам routeProvider, в первую очередь, сделать некоторые маршруты, как описанный here, выполнить ваши действия формы, перенаправить на страницу и заполнить представления соответственно, она должна работать.

+0

Привет, я внес изменения и вызвал doLogin() с помощью ng-click (который изменяет $ scope.message), но {{message}} в home.html до сих пор не обновлялся. Даже если div-n-view находится внутри, как вы посоветовали. –

+0

@ DavidStampher обновлен! –

+0

Привет, routeProvider уже в примере: P/и/home направляются на разные виды, но один и тот же контроллер. –

2

Каждый раз, когда изображение загружается, код контроллера с новой областью выполняется так, что новое сообщение не отражается. Таким образом, поток будет выглядеть как Контроллер landPage, который является MainCtrl с его областью при выполнении $ scope.doLogin, изменит переменную $ scope.message на «Сообщение изменено» и при изменении местоположения на дому MainCtrl назначается домашней странице с новая область, которая будет продолжать выполнение самой первой строки MainCtrl, т.е.

$scope.message = 'testing message'; 

Как вы решили использовать общий контроллер для входа и домашних страниц

Попробуйте удалить вариант контроллера в

  when('/', { 
       templateUrl: './app/views/landingpage.html', 
       controller: 'MainCtrl' 
      }). 
      when('/home', { 
       templateUrl: './app/views/home.html', 
       controller: 'MainCtrl' 
      }) 

и назначить контроллер в

<div ng-controller="MainCtrl"> 
    <!--omitted--> 
    <div ng-view></div> 
</div> 

Или еще другие параметры должны были бы передавать параметры или использовать ui-router, где в вложенных представлениях автоматически наследуется от родительских контроллеров, не перезапуская логику контроллера.

+0

Эй, Коди, я немного поиграю с этим и посмотрю, все ли работает так, как я их тоже хочу. –

+0

уверен, что @DavidStampher, пожалуйста, подумайте о принятии: P: P – NavyCody

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