Javascript 如何在工厂/服务中将数据推送到阵列(角度/离子)

Javascript 如何在工厂/服务中将数据推送到阵列(角度/离子),javascript,angularjs,ionic-framework,Javascript,Angularjs,Ionic Framework,我想创建一个如下工作的应用程序: 如您所见,当我们单击favorite按钮时,该项将存储在factory中,我们可以在另一个页面favorite页面中调用它 在我的例子中:我使用服务来存储项目数据,并创建工厂来存储推送的项目 这是我的代码:我在服务中存储数据 .service('dataService',function(){ var service=this; this.playerlist = [ { name: 'Leonel Messi', ava:"https://

我想创建一个如下工作的应用程序:

如您所见,当我们单击favorite按钮时,该项将存储在factory中,我们可以在另一个页面favorite页面中调用它

在我的例子中:我使用服务来存储项目数据,并创建工厂来存储推送的项目

这是我的代码:我在服务中存储数据

.service('dataService',function(){
  var service=this;
    this.playerlist = [
    { name: 'Leonel Messi', ava:"https://i.scdn.co/image/d1f58701179fe768cff26a77a46c56f291343d68" },
    { name: 'Cristiano Ronaldo', ava:"https://i.scdn.co/image/d1f58701179fe768cff26a77a46c56f291343d68" },
    { name: 'Zlatan Ibrahimovic', ava:"https://i.scdn.co/image/d1f58701179fe768cff26a77a46c56f291343d68" },
    { name: 'Wayne Rooney', ava:"https://i.scdn.co/image/d1f58701179fe768cff26a77a46c56f291343d68" },
    { name: 'Michael Carrick', ava:"https://i.scdn.co/image/d1f58701179fe768cff26a77a46c56f291343d68" },
    { name: 'Phil Jones', ava:"https://pbs.twimg.com/profile_images/473469725981155329/E24vfxa3_400x400.jpeg" },
    { name: 'Angel di Maria', ava:"https://i.scdn.co/image/d1f58701179fe768cff26a77a46c56f291343d68" }
    ]; 
})

.factory('User', function() {
    var play = { favorites: []}

    play.addToFavorites = function(song) {
      play.favorites.unshift(song);
    }

    play.removeFromFavorites = function(player, index) {
      play.favorites.splice(index, 1);
    }
    return play;
})
控制器:

.controller('ChooseTabCtrl', function($scope, dataService, User) {
  $scope.dataService=dataService;
  $scope.addToFavorite = function (item) {
      User.favorites.unshift(dataService.playerList.indexOf(), 1);
  }
})
但是,当我单击每个项目上的收藏夹按钮时,列表不会显示在收藏夹页面中。 在爱奥尼亚应用程序中可以这样做吗


这是我的代码笔:

您的代码笔中的代码有一些问题

在控制器中,当player对象实际上是playerList all lowercase时,您正在引用dataService.playerList.indexOf。此外,我假设您希望实际获取播放器的索引,因此该行需要更改为:

User.favorites.unshift(dataService.playerlist.indexOf(item));
// remove the `, 1` otherwise you'll be adding a `1` to the array everytime
在您看来,您需要更改以下内容:

// wrong
ng-click="addToFavorite(item)"

// right 
ng-click="addToFavorite(player)"
$scope.players=dataService;

// to
$scope.players=dataService.playerlist;
接下来,在ListTabCtrl中更改以下内容:

// wrong
ng-click="addToFavorite(item)"

// right 
ng-click="addToFavorite(player)"
$scope.players=dataService;

// to
$scope.players=dataService.playerlist;
然后在视图中:

<ion-item ng-repeat="player in favorites" class="item item-avatar" href="#">
  <img ng-src="{{players[player].ava}}">
  <h2>{{players[player].name}}</h2>
  <p>Back off, man. I'm a scientist.</p>
  <ion-option-button class="button-assertive" ng-click="removePlayer(player, $index)">
  <i class="ion-minus-circled"></i>
  </ion-option-button>
</ion-item>

我在jsbin上发布了一个代码的工作示例:

看起来控制器的addToFavorite函数中对dataService.playerlist的引用中有一个错误的大写字母L。请检查控制台是否有错误:TypeError:无法读取作用域中未定义的属性'indexOf'。$Scope.addToFavorite index.html:161别担心。希望你能明白为什么改变的部分需要改变,但如果不是,我很乐意解释: