2016-07-07 11 views
0

私は最初のIonicアプリケーションを作成しています。このアプリケーションは、お金を借りる人を追跡するために使用されます。私は金額を追加した後、それらの金額を含むngリストが追加されたページを作成しました。Ionicでアイテムを追加した後にng-listが更新されない

問題は、ng-repeatがリストを作成するために使用する配列(name = amount)にアイテムを追加した後、ページを更新するまでアイテムが追加されたことを示していないことです。

コード:金額の概要を示し

私のhtmlページ:追加量のポップアップ用

<ion-view style="" class=" " id="page2" title="Te ontvangen default page"> 
<ion-pane> 
    <ion-content class="has-header" padding="true"> 
     <div style="margin-right:-20px;"> 
      <button ng-click="voegtoe()" class=" button button-balanced button-full " style="left:-10px;" id="teOntvangenDefaultPage-button5">Toevoegen</button> 
     </div> 
     <ion-list class=" " id="teOntvangenDefaultPage-list1"> 
      <ion-item ng-repeat="amount in amounts">{{amount.naam}} {{amount.bedrag}} {{amount.datum}} 
       <ion-option-button class="button-assertive" 
           ng-click="delete(amount)"> 
       Delete 
       </ion-option-button> 
      </ion-item> 
     </ion-list> 
    </ion-content> 
</ion-pane> 
</ion-view> 

私のhtmlページ:

<ion-view style="" class=" " id="page5" title="Voeg toe"> 
<ion-content class="has-header" padding="true"> 
    <form class="list " id="voegToeOntvangenForm" name="voegToeOntvangenForm" ng-controller="voegToeOntvangenCtrl"> 
     <ion-list class=" " id="voegToe-list3"> 
      <label id="voegToeNaam" class="item item-input "> 
       <span class="input-label">Naam</span> 
       <input placeholder="Wie?" type="text" ng-model="naam"> 
      </label> 
      <label id="voegToeBedrag" class="item item-input "> 
       <span class="input-label">€</span> 
       <input placeholder="Bedrag" type="number" ng-model="bedrag"> 
      </label> 
      <label id="voegToeDatum" class="item item-input "> 
       <span class="input-label">Datum geleend</span> 
       <input placeholder="Datum geleend" type="date" ng-model="datum"> 
      </label> 
     </ion-list> 
     <button ng-click="saveOntvangen()" class=" button button-balanced button-block " id="voegToe-button6">Toevoegen</button> 
     <button ng-click="cancelOntvangen()" class=" button button-assertive button-block " id="voegToeCancel-button6">Annuleren</button> 
    </form> 
</ion-content> 

マイすべてのコントローラを含むapp.jsファイル:

// Ionic Starter App 

// angular.module is a global place for creating, registering and retrieving Angular modules 
// 'starter' is the name of this angular module example (also set in a <body> attribute in index.html) 
//- the 2nd parameter is an array of 'requires' 
// 'starter.services' is found in services.js 
// 'starter.controllers' is found in controllers.js 
var app = angular.module('app', ['ionic', 'app.controllers', 'app.routes', 'app.services', 'app.directives']); 


app.run(function($ionicPlatform) { 
    $ionicPlatform.ready(function() { 
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 
    // for form inputs) 
    if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) { 
     cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 
     cordova.plugins.Keyboard.disableScroll(true); 
    } 
    if (window.StatusBar) { 
     // org.apache.cordova.statusbar required 
     StatusBar.styleDefault(); 
    } 
    }); 
}) 


app.controller("OntvangenCtrl", function($scope, $location) { 

    if(JSON.parse(window.localStorage.getItem('records')) == null) 
     { 
      amounts = []; 
     } 
     else 
     { 
      amounts = JSON.parse(window.localStorage.getItem('records')); 
     } 


    console.log('ontvangenctrl'); 
    $scope.amounts = amounts; 


    $scope.voegtoe = function() { 

    $location.path("/toevoegenontvangen"); 
    } 

    $scope.delete = function(item){ 


     var searchTerm = item; 
     var records = JSON.parse(window.localStorage.getItem('records')); 

     for (var i=records.length-1; i>=0; i--) { 

      if (angular.toJson(records[i]) === angular.toJson(searchTerm)) { 

       records.splice(i, 1); 
       // break;  //<-- Uncomment if only the first term has to be removed 
      } 
     } 

     window.localStorage.setItem('records', JSON.stringify(records)); 
     $scope.amounts = records; 

     } 

    $scope.deleteall = function(){ 

     var records = JSON.parse(window.localStorage.getItem('records')); 

     for (var i=records.length-1; i>=0; i--) { 
       records.splice(i, 1); 
     } 

     window.localStorage.setItem('records', JSON.stringify(records)); 

     } 

}); 

app.controller("voegToeOntvangenCtrl", function($scope, $location, $window) { 

    $scope.saveOntvangen = function() { 

     //console.log($scope.naam); 
     //console.log($scope.bedrag); 
     //console.log($scope.datum); 
     var amounts; 

     if(JSON.parse(window.localStorage.getItem('records')) == null) 
     { 
      amounts = []; 
     } 
     else 
     { 
      amounts = JSON.parse(window.localStorage.getItem('records')); 
     } 

     var current = new Object(); 
     current.naam = $scope.naam; 
     current.bedrag = $scope.bedrag; 
     current.datum = $scope.datum; 

     amounts.push(current); 

     console.log(amounts); 

     window.localStorage.setItem('records', JSON.stringify(amounts)); 

     $scope.amounts = amounts; 

     $window.location.href = "#/teontvangen/teontvangen"; 

} 

$scope.cancelOntvangen = function() { 

     $location.path("/teontvangen"); 


} 



}); 

app.controller("voegToeBetalenCtrl", function($scope, $location) { 



}); 

私routes.jsファイル:これはhappingされている理由のアイデアを持っている人が

angular.module('app.routes', []) 

.config(function($stateProvider, $urlRouterProvider) { 

    // Ionic uses AngularUI Router which uses the concept of states 
    // Learn more here: https://github.com/angular-ui/ui-router 
    // Set up the various states which the app can be in. 
    // Each state's controller can be found in controllers.js 
    $stateProvider 



     .state('tabsController.teOntvangenDefaultPage', { 
    url: '/teontvangen', 
    views: { 
     'tab1': { 
     templateUrl: 'templates/teOntvangenDefaultPage.html', 
     controller: 'OntvangenCtrl' 
     } 
    } 
    }) 

    .state('tabsController.teBetalenDefaultPage', { 
    url: '/tebetalen', 
    views: { 
     'tab2': { 
     templateUrl: 'templates/teBetalenDefaultPage.html', 
     controller: 'teBetalenDefaultPageCtrl' 
     } 
    } 
    }) 

    .state('tabsController', { 
    url: '/teontvangen', 
    templateUrl: 'templates/tabsController.html', 
    abstract:true 
    }) 

    .state('voegToe', { 
    url: '/toevoegenontvangen', 
    templateUrl: 'views/voegToeOntvangen.html', 
    controller: 'voegToeOntvangenCtrl' 
    }) 

    .state('voegToe2', { 
    url: '/toevoegenbetalen', 
    templateUrl: 'views/voegToeBetalen.html', 
    controller: 'voegToeBetalenCtrl' 
    }) 

$urlRouterProvider.otherwise('/teontvangen/teontvangen') 



}); 

ありますか?

+0

使用範囲。$ apply();コントローラ内の$ scope.saveOntvangen関数内の – Developer

+0

関数は、$ window.location.href = "#/ teontvangen/teontvangen"の後にあります。 ? –

+0

更新された回答を確認してください。 – Developer

答えて

0

データバインド後に$scope.$apply()または$scope.$applyAsync();を使用してください。ここで

は、その上のドキュメントです:https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$apply

// Ionic Starter App 

// angular.module is a global place for creating, registering and retrieving Angular modules 
// 'starter' is the name of this angular module example (also set in a <body> attribute in index.html) 
//- the 2nd parameter is an array of 'requires' 
// 'starter.services' is found in services.js 
// 'starter.controllers' is found in controllers.js 
var app = angular.module('app', ['ionic', 'app.controllers', 'app.routes', 'app.services', 'app.directives']); 


app.run(function($ionicPlatform) { 
    $ionicPlatform.ready(function() { 
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 
    // for form inputs) 
    if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) { 
     cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 
     cordova.plugins.Keyboard.disableScroll(true); 
    } 
    if (window.StatusBar) { 
     // org.apache.cordova.statusbar required 
     StatusBar.styleDefault(); 
    } 
    }); 
}) 


app.controller("OntvangenCtrl", function($scope, $location) { 

    if(JSON.parse(window.localStorage.getItem('records')) == null) 
     { 
      amounts = []; 
     } 
     else 
     { 
      amounts = JSON.parse(window.localStorage.getItem('records')); 
     } 


    console.log('ontvangenctrl'); 
    $scope.amounts = amounts; 
    $scope.$applyAsync(); 

    $scope.voegtoe = function() { 

    $location.path("/toevoegenontvangen"); 
    } 

    $scope.delete = function(item){ 


     var searchTerm = item; 
     var records = JSON.parse(window.localStorage.getItem('records')); 

     for (var i=records.length-1; i>=0; i--) { 

      if (angular.toJson(records[i]) === angular.toJson(searchTerm)) { 

       records.splice(i, 1); 
       // break;  //<-- Uncomment if only the first term has to be removed 
      } 
     } 

     window.localStorage.setItem('records', JSON.stringify(records)); 
     $scope.amounts = records; 
     $scope.$applyAsync(); 
     } 

    $scope.deleteall = function(){ 

     var records = JSON.parse(window.localStorage.getItem('records')); 

     for (var i=records.length-1; i>=0; i--) { 
       records.splice(i, 1); 
     } 

     window.localStorage.setItem('records', JSON.stringify(records)); 

     } 

}); 

app.controller("voegToeOntvangenCtrl", function($scope, $location, $window) { 

    $scope.saveOntvangen = function() { 

     //console.log($scope.naam); 
     //console.log($scope.bedrag); 
     //console.log($scope.datum); 
     var amounts; 

     if(JSON.parse(window.localStorage.getItem('records')) == null) 
     { 
      amounts = []; 
     } 
     else 
     { 
      amounts = JSON.parse(window.localStorage.getItem('records')); 
     } 

     var current = new Object(); 
     current.naam = $scope.naam; 
     current.bedrag = $scope.bedrag; 
     current.datum = $scope.datum; 

     amounts.push(current); 

     console.log(amounts); 

     window.localStorage.setItem('records', JSON.stringify(amounts)); 

     $scope.amounts = amounts; 
     $scope.$applyAsync(); 
     $window.location.href = "#/teontvangen/teontvangen"; 

} 

$scope.cancelOntvangen = function() { 

     $location.path("/teontvangen"); 


} 



}); 

app.controller("voegToeBetalenCtrl", function($scope, $location) { 



}); 
+0

これまでに試したことがありますが、このエラーが発生しています。エラー:[$ rootScope:inprog] $が既に適用中です。 –

+0

は$ scopeで私の回答を更新しました$ applyAsync();ファンクション – Developer

+0

時間を割いていただきありがとうございます。エラーは消えましたが、f5キーを押して手動で更新するまではまだ動作していません。 –

0

使用$タイムアウトし、それが自動的に適用されます$を呼び出すと値も更新されますあなたの関数を呼び出す追加します。あなたはvoegToeOntvangenCtrlコントローラで

+0

なぜこれを行うのか説明してください。コード内でこれを実装する必要がありますか?私はangularjsに新しいです:)。 –

+0

ng-click = "saveOntvangen()" class = "このボタンを使用する代わりにボタンを押します。ng-click =" $ timeout(saveOntvangen、500); –

+0

私はこれを試しましたが、値はリフレッシュ後まで表示されません。これ以上のアイデアはありますか? –

0

使用している代わりに、あなたが使用する必要があります。このこの

var amounts; 

    if(JSON.parse(window.localStorage.getItem('records')) == null) 
    { 
     amounts = []; 
    } 
    else 
    { 
     amounts = JSON.parse(window.localStorage.getItem('records')); 
    } 

はどこでもであなたが使用している$スコープを持つ変数を金額には、これはあなたの問題を解決します

$scope.amounts=[]; 

    if(JSON.parse(window.localStorage.getItem('records')) == null) 
    { 
     $scope.amounts = []; 
    } 
    else 
    { 
     $scope.amounts = JSON.parse(window.localStorage.getItem('records')); 
    } 

希望の金額

関連する問題