AngularJS 在 ng-repeat 中传递函数
AngularJS Passing a Function in ng-repeat
您好,我正在使用 Firebase 和 AngularJS 构建应用程序。
我有两个 parents,一个包含 游戏中的每个怪物 ,另一个包含 用户拥有的每个怪物 。
我需要一个中继器来消除用户的怪物,并显示其他所有内容。我尝试了很多方法,我觉得使用指令我非常接近逻辑。
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 的新手,非常感谢任何帮助。
(我也是 Whosebug 的新手,所以如果我做错了什么,请告诉我)
谢谢!!!
我相信您可以通过更简单的方式实现这一点,而无需使用自定义指令。我假设您的 JSON 中有属性可以确定怪物是否属于用户。 ng-hide
根据您提供的表达式隐藏元素。也许试试这个:
<div ng-repeat="monster in monsters">
<h2 ng-hide="monster.isUser">{{monster.name}}</h2>
</div>
正如@Baltic 所建议的,您可以使用 ng-hide:
在您看来:
<div ng-repeat="monster in monsters">
<h2 ng-hide="isUserMonster(monster.name)">{{monster.name}}</h2>
</div>
在你的countroller中写你的逻辑来检查用户是否有怪物:
$scope.isUserMonster(monsterName)
{
//your logic goes here
//you will probably access your database to check monster existance with the user here
}
从 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>
您好,我正在使用 Firebase 和 AngularJS 构建应用程序。 我有两个 parents,一个包含 游戏中的每个怪物 ,另一个包含 用户拥有的每个怪物 。
我需要一个中继器来消除用户的怪物,并显示其他所有内容。我尝试了很多方法,我觉得使用指令我非常接近逻辑。
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 的新手,非常感谢任何帮助。 (我也是 Whosebug 的新手,所以如果我做错了什么,请告诉我)
谢谢!!!
我相信您可以通过更简单的方式实现这一点,而无需使用自定义指令。我假设您的 JSON 中有属性可以确定怪物是否属于用户。 ng-hide
根据您提供的表达式隐藏元素。也许试试这个:
<div ng-repeat="monster in monsters">
<h2 ng-hide="monster.isUser">{{monster.name}}</h2>
</div>
正如@Baltic 所建议的,您可以使用 ng-hide:
在您看来:
<div ng-repeat="monster in monsters">
<h2 ng-hide="isUserMonster(monster.name)">{{monster.name}}</h2>
</div>
在你的countroller中写你的逻辑来检查用户是否有怪物:
$scope.isUserMonster(monsterName)
{
//your logic goes here
//you will probably access your database to check monster existance with the user here
}
从 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>