【问题标题】:AngularJS Passing a Function in ng-repeatAngularJS 在 ng-repeat 中传递函数
【发布时间】:2017-06-20 13:56:34
【问题描述】:

您好,我正在使用 Firebase 和 AngularJS 构建应用程序。 我有两个父母,一个包含游戏中的每个怪物,另一个包含用户拥有的每个怪物

我需要一个中继器来消除用户怪物,并显示其他所有内容。我尝试了很多方法,我觉得使用指令我非常接近逻辑。

index.html:

<div ng-repeat="monster in monsters" my-directive="monster">
   <h2>{{monster.name}}</h2>
</div>

services.js

.directive('myDirective', function(Auth, $firebaseArray){
  rdef =''

  Auth.$onAuth(function(authData) {
   var username = authData.uid;

   var ref = new Firebase("firebaseurl");
   var hopref = ref.child(username);

   var results = $firebaseArray(hopref);

   results.$loaded(function(x) {
    angular.forEach(results, function(value, key){
      if(myDirective.name == value.Monster){
        rdef ='<div></div>'
      }else{
        rdef ='<div>{{ myDirective.name }}</div>'
      }
     });
   });
 });

 return {
  restrict: "A",
  template: rdef ,
  scope: {
   myDirective: '='
  },
  link: function(scope, element, attrs) {
    console.log('MyData', scope.myDirective);
  }
 };

});

我对 Angular 还是很陌生,任何帮助都将不胜感激。 (我也是 Stackoverflow 的新手,所以如果我做错了什么,请告诉我)

谢谢!!!

【问题讨论】:

    标签: angularjs loops firebase ng-repeat directive


    【解决方案1】:

    ng-repeat 中排除对象的正确方法是使用过滤器。你没有包括你的对象的样子,所以我给你一个简单的例子:

    app.controller("myCtrl", function($scope) {
        // assuming your data looks something like this:
        $scope.user = {
            monsters: ["Monster1", "Monster5", "Monster6"]
        }
        $scope.monsters = [{
            name: "Monster1"
        }, {
            name: "Monster2"
        }, {
        // etc.
        }
    });
    
    // filter
    app.filter("notInUser", function() {
        return function(monsters, user) {
            return monsters.filter(function(monster) {
                return user.monsters.indexOf(monster) === -1;
            });
        }
    });
    

    然后你可以像这样使用过滤器:

    <div ng-repeat="monster in monsters | notInUser:user">
       <h2>{{monster.name}}</h2>
    </div>
    

    this working jsfiddle

    【讨论】:

      【解决方案2】:

      正如@Baltic 建议的那样,您可以使用 ng-hide 来做到这一点:

      在你看来:

      <div ng-repeat="monster in monsters">
          <h2 ng-hide="isUserMonster(monster.name)">{{monster.name}}</h2>
      </div>
      

      在你的计数器中写下你的逻辑来检查用户是否有怪物:

      $scope.isUserMonster(monsterName)
      {
          //your logic goes here
          //you will probably access your database to check monster existance with the user here
      }
      

      【讨论】:

        【解决方案3】:

        我相信您可以通过更简单的方式实现这一目标,而无需使用自定义指令。我假设您的 JSON 中有属性可以确定怪物是否属于用户。 ng-hide 根据您提供的表达式隐藏元素。也许试试这个:

        <div ng-repeat="monster in monsters">
            <h2 ng-hide="monster.isUser">{{monster.name}}</h2>
        </div>
        

        【讨论】:

        • 您好,非常感谢您。我的数据库的工作方式是,当用户“捕捉”一个怪物时,它会在“Monster”数据库中随机播放并将其添加到“UserMonsters”数据库中。对我来说,这似乎比让每个用户都保存在每个怪物下要小得多?还是我走错路了?
        • 我建议创建一个简单的数组,其中只包含用户尚未捕获的怪物。在“捕捉”怪物时,仅推送到该数组,并使用ng-repeat 仅在您的视图中显示那些怪物。所有这些都可以在您的控制器中实现,而无需修改数据库。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-30
        • 2016-11-28
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多