我正在创建我的第一个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文件:
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 :(得分: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) {
});
答案 1 :(得分:0)
使用$ timeout并添加调用你的函数,它会自动调用$ apply,值也会被刷新。
答案 2 :(得分:0)
在voegToeOntvangenCtrl控制器中,您正在使用此
var amounts;
if(JSON.parse(window.localStorage.getItem('records')) == null)
{
amounts = [];
}
else
{
amounts = JSON.parse(window.localStorage.getItem('records'));
}
而不是这个,你应该在你使用金额
的任何地方使用金额变量和$ scope$scope.amounts=[];
if(JSON.parse(window.localStorage.getItem('records')) == null)
{
$scope.amounts = [];
}
else
{
$scope.amounts = JSON.parse(window.localStorage.getItem('records'));
}
希望这会解决你的问题