2014-11-28 2 views
0

Я тренирую себя в разработке мобильных приложений, и в настоящее время я разрабатываю приложение для новорожденных детей, используя Phonegap, Onsen UI и AngularJS.

При инициализации пользователи должны определить, бодрствует ли их ребенок или спит, чтобы запустить трекер. Я использовал модальные окна для этого на главной странице. Как только они нажмут, я хочу отобразить текст на домашней странице, например «Ваш ребенок спит» или «Ваш ребенок бодрствует», в зависимости от их выбора.

Дело в том, что я не могу обновить представление после нажатия на одну из кнопок ... Я знаю, что это асинхронный запрос, поэтому мне нужно использовать $ apply() для перезапуска цикла углового дайджеста, но Я не могу сделать это работает ...

Вот мой код:

Index.html

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta name="apple-mobile-web-app-capable" content="yes"> 
    <meta name="mobile-web-app-capable" content="yes"> 
    <title>Colette</title> 

    <link rel="stylesheet" href="lib/onsen/css/onsenui.css"> 
    <link rel="stylesheet" href="styles/onsen-css-components-blue-basic-theme.css"> 
    <link rel="stylesheet" href="styles/app.css"/> 

    <script src="lib/onsen/js/angular/angular.js"></script>  
    <script src="lib/onsen/js/onsenui.js"></script> 
    <script src="lib/jquery-2.1.1.min.js "></script> 

    <script src="cordova.js"></script> 

    <script> 
    document.addEventListener("deviceready", function() { 
     // retrieve the DOM element that had the ng-app attribute 
     var domElement = $('html'); 
     angular.bootstrap(domElement, ["app"]); 
    }, false); 
    var app = angular.module('app',['onsen']); 
    </script> 

    <script src="lib/moment.js"></script> 
    <script src="lib/utils.js"></script> 
    <script src="home.js"></script> 
    <script src="daily_stats.js"></script> 
    <script src="history.js"></script> 
    <script src="settings.js"></script> 
</head> 

<body>  

    <ons-sliding-menu 
    menu-page="menu.html" main-page="home.html" side="left" 
    var="menu" type="reveal" max-slide-distance="260px" swipable="true"> 
    </ons-sliding-menu> 

</body> 
</html> 

home.html (загрузка по умолчанию):

<ons-modal id="welcome" ng-controller="home"> 
    <ons-row> 
     <ons-col align="center"> 
     <h2>Welcome !</h2> 
     To initialize the app,<br />please tell us if your<br />baby is currently 
     </ons-col> 
    </ons-row> 
    <ons-row style="margin-top: 20px;"> 
     <ons-col align="right" size="40%"> 
     <ons-button ng-click="init(false)">ASLEEP</ons-button> 
     </ons-col> 
     <ons-col align="center" size="20%">OR</ons-col> 
     <ons-col align="left" size="40%"> 
     <ons-button ng-click="init(true)">AWAKE</ons-button> 
     </ons-col> 
    </ons-row> 
    <ons-row style="margin-top: 20px;"> 
     <ons-col align="center"> 
     Thanks ! 
     </ons-col> 
    </ons-row> 
</ons-modal> 

<ons-page modifier="home" class="home" ng-controller="home"> 
    <ons-toolbar> 
    <div class="left"> 
     <ons-toolbar-button ng-click="menu.toggle()"> 
     <ons-icon icon="ion-navicon" size="28px" fixed-width="false"></ons-icon> 
     </ons-toolbar-button> 
    </div> 
    <div class="center"><ons-icon icon="fa-home"></ons-icon> Home</div> 
    </ons-toolbar> 

    <ons-row style="margin-top: 100px;"> 
    <ons-col align="center"> 
     <h3 class="state">{{state}}<br />{{stateTime}}.</h3> 
     <ons-button ng-click="toggleState()">{{button_value | uppercase}}</ons-button> 
     <p class="tips">{{tips}}</p> 
    </ons-col> 
    </ons-row> 
</ons-page> 

Home.js (домашний контроллер):

/* 
* Home Controller 
*/ 

app.controller('home', function($scope,$timeout,$http){ 

    $scope.appHash = ""; 
    $scope.button_value = ""; 
    $scope.state = ""; 
    $scope.stateTime = ""; 
    $scope.tips = ""; 
    $scope.awake = true; 
    $scope.begin = new Date(); 
    $scope.records = new Array(); 

    $scope.init = function(awake){  
     if(awake){ 
      $scope.button_value = "asleep"; 
      $scope.state = "Your baby is awake"; 
      $scope.tips = "Click 'ASLEEP' when your baby start to sleep."; 
      $scope.awake = true; 
     } 
     else{ 
      $scope.button_value = "awake"; 
      $scope.state = "Your baby is asleep"; 
      $scope.tips = "Click 'AWAKE' when your baby is awake."; 
      $scope.awake = false; 
     }  
     //menu.setMainPage('home.html'); 
     $scope.saveState(); 
     $('#welcome').hide(); 
     $scope.$apply(); 
    } 

    $scope.restore = function(){ 
     $scope.appHash = localStorage.getItem('appHash'); 
     $scope.button_value = localStorage.getItem('button_value'); 
     $scope.state = localStorage.getItem('state'); 
     $scope.tips = localStorage.getItem('tips'); 
     $scope.awake = localStorage.getItem('awake'); 
     $scope.begin = new Date(localStorage.getItem('begin')); 
     $scope.records = JSON.parse(localStorage.getItem('records')); 
    } 

    $scope.saveState = function(){ 
     localStorage.setItem('button_value', $scope.button_value); 
     localStorage.setItem('state', $scope.state); 
     localStorage.setItem('tips', $scope.tips); 
     localStorage.setItem('awake', $scope.awake); 
     localStorage.setItem('begin', $scope.begin); 
     localStorage.setItem('records', JSON.stringify($scope.records));   
    } 


    if(localStorage.getItem('appHash') == null){ 
     $http.get(backendURL+'?method=addApp&id=1'). 
      success(function(data, status, headers, config) { 
       //response = JSON.parse(data); 
       localStorage.setItem('appHash', data.result[0]);     
       $scope.appHash = data.result[0]; 
      }). 
      error(function(data, status, headers, config) { 
        $scope.appHash = data.result[0]; 
      }); 
     $('#welcome').show(); 
    } 
    else{ 
     $('#home').show(); 
     $scope.restore(); 
     $scope.refreshStateTime(); 
    } 

}); 

Когда один из начальной кнопки была cicked, метод init() вызывается с хорошим параметром. Но вид не обновляется.

Я прокомментировал menu.setMainPage('home.html');, что было временным решением для перезагрузки страницы.

Я не могу понять, что я делаю неправильно здесь.

Я также совершенно новичок в этих трех технологиях (Phonegap, Onsen UI и Angular.js), это приложение является обучением на данный момент.

Благодарим за помощь!

ответ

2

Каждый контроллер представляет собой новый экземпляр, а не одноэлементный. Таким образом, вы обновляете состояние одного контроллера через init(), но ui, который вы пытаетесь обновить, привязан к переменным другого экземпляра контроллера с его собственной отдельной переменной $ scope.

<ons-modal id="welcome" ng-controller="home"> 
    ... 
</ons-modal> 

<ons-page modifier="home" class="home" ng-controller="home"> 
... 
</ons-page> 

http://plnkr.co/edit/wU2itKfEJZ8JvdaVsRgZ?p=preview

Одно из решений, чтобы обернуть ваш HTML в другой тег и назначить контроллер для этого. Затем удалите два других существующих контроллера.

<div ng-controller="home"> 
    <ons-modal id="welcome"> 
     ... 
    </ons-modal> 

    <ons-page modifier="home" class="home"> 
    ... 
    </ons-page> 
</div> 

http://plnkr.co/edit/wU2itKfEJZ8JvdaVsRgZ?p=preview

+0

Это вполне имеет смысл, спасибо! – edouard

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