如何使用Firebase的Ng-if [英] How to use an Ng-if with Firebase
问题描述
我知道ng-if指令创建一个新的子范围,我想知道如何和如果有可能发挥ng-if到另一个。
现在我看不到任何图标。我已经尝试了隐藏,但我同时在
中看到两个图标,不可能解决这个问题...我也尝试了ng-show,但是与ng-if的结果相同。 p>
Set()函数返回true或false,这是因为我可以在控制台中看到结果。
想法?
$ b
$ scope.set = function($ r)
{$ b (b)$ b $ firebase.database()。ref('events /'+ $ r.selfID).once(value)。 ).nbPerson;
var varPerson = snapshot.val()。varPerson;
$ b //console.log(\"nbPerson:,nbPerson);
//console.log (varPerson,varPerson);
if(nbPerson === varPerson)
{
//console.log(true);
return true ;
}
else
{
//console.log(\"false);
return false;
}
});
};
< button ng- if =give(f)=== falseclass =badge badge-positiveng-click =joinEvent(e)>
< span ng-if =set(r)=== true>
< / span>
< span ng-if =set(r)=== false>
< / span>
< / button>
编辑:
我添加了set()函数,$ r是来自Firebase DB的记录,它有一个selfID变量和他的记录ID。
我确定give()函数正在工作,因为我有另外一个运行ng-if =give(f)=== true 。
编辑2:
(new编辑3:
(依赖项中添加$ q)
函数($ scope,$ rootScope,$ q,$ stateParams,$ firebase,$ firebaseArray,$ state,$ ionicPopup){
$ scope。 set = function($ r)
{
$ scope.varPerson =;
$ scope.nbPerson =;
asePromise = firebase.database()。ref('events /'+ $ r.selfID).once(value);
$ q.when(basePromise).then(function(snapshot)
{
$ scope.nbPerson = snapshot.val()。nbPerson;
$ scope如果($ scope.nbPerson === $ scope.varPerson)
{
返回true;
} varPerson;
else
{
return false;
}
});
}
};
编辑4:
(最后)
好吧,我无法应付同步问题,所以我只是在两个ng-if里面添加一个测试,所以没有set()函数。
非常感谢那些帮助过我的人,尤其是@georgeawg的专业知识!
< span ng-if =r.nbPerson === r.varPerson>
< / span>
< span ng-if =r.nbPerson> r.varPerson>
< / span>
firebase API返回的承诺没有与AngularJS框架集成在一起。
>使用 启动后立即执行 EM>。 Part3的控制台日志位于由 $ q服务,在数据从服务器到达之后调用, XHR 完成。 有关更多信息,请参见如何在成功处理程序外使用$ http promise response 。 I know that the ng-if directive creates a new child scope and I would like to know HOW and IF it is possible to play a ng-if into an other one. For now I can't see any icons. I've tried ng-hide, but I saw the two icons in the
same time, impossible to fix that problem...I also tried ng-show, but with the same results as ng-if. Set() function returns true or false, it's working because I can see the result in the console. Any ideas ?
EDIT : I added the set() function, $r is a record from a Firebase DB, it has a "selfID" variable with his record ID. I'm sure that give() function is working, because I have an other button running with the ng-if="give(f) === true". This entire code is working on the same controller. EDIT 2 :
(new snippet) EDIT 3 :
(add $q in dependency) EDIT 4 :
(Finally) Ok, I wasn't able to cope with the synchronous problems, so I simply add a test inside the two ng-if, so without the set() function. Thanks a lot for those who helped me, and especially @georgeawg for his expertise ! Promises returned by the firebase API are not integrated with the AngularJS framework. Use $q.when to create an AngularJS promise from a firebase promise: AngularJS modifies the normal JavaScript flow by providing its own event processing loop. This splits the JavaScript into classical and AngularJS execution context. Only operations which are applied in the AngularJS execution context will benefit from AngularJS data-binding, exception handling, property watching, etc. The firebase promise needs to be converted to an AngularJS promise to bring the event into the AngularJS execution context. Save the returned value and log it. By using this simple debugging technique, you will quickly understand the problem.
Demo
$scope.set = function($r)
{
firebase.database().ref('events/'+$r.selfID).once("value").then(function(snapshot)
{
var nbPerson = snapshot.val().nbPerson;
var varPerson = snapshot.val().varPerson;
//console.log("nbPerson :", nbPerson);
//console.log("varPerson", varPerson);
if(nbPerson === varPerson)
{
//console.log("true");
return true;
}
else
{
//console.log("false");
return false;
}
});
};
<button ng-if ="give(f) === false" class="badge badge-positive" ng-click="joinEvent(e)">
<span ng-if ="set(r) === true">
<ion-icon class="ion-person-add give-var"></ion-icon>
</span>
<span ng-if ="set(r) === false">
<ion-icon class="ion-person-add var"></ion-icon>
</span>
</button>
function ($scope, $rootScope, $q, $stateParams, $firebase, $firebaseArray, $state, $ionicPopup) {
$scope.set = function($r)
{
$scope.varPerson = "";
$scope.nbPerson = "";
var basePromise = firebase.database().ref('events/'+$r.selfID).once("value");
$q.when(basePromise).then(function(snapshot)
{
$scope.nbPerson = snapshot.val().nbPerson;
$scope.varPerson = snapshot.val().varPerson;
if($scope.nbPerson === $scope.varPerson)
{
return true;
}
else
{
return false;
}
});
}
};
<span ng-if ="r.nbPerson === r.varPerson">
<ion-icon class="ion-person-add give-var"></ion-icon>
</span>
<span ng-if ="r.nbPerson > r.varPerson">
<ion-icon class="ion-person-add var"></ion-icon>
</span>
Firebase promises are not AngularJS promises
var basePromise = firebase.database().ref('events/'+$r.selfID).once("value");
$q.when(basePromise).then(function(snapshot)
{
//.then block code
});
To debug the
$scope.set
function:$scope.set = function($r) {
var value = set($r);
console.log(value);
return value;
});
//BUGGY function
function set($r)
{
firebase.database().ref('events/'+$r.selfID).once("value").then(function(snapshot)
{
var nbPerson = snapshot.val().nbPerson;
var varPerson = snapshot.val().varPerson;
//console.log("nbPerson :", nbPerson);
//console.log("varPerson", varPerson);
if(nbPerson === varPerson)
{
//console.log("true");
return true;
}
else
{
//console.log("false");
return false;
}
});
};
the result of my set() function is unreachable... :( Is my new function (Edit 3), correct ?
The return statements inside .then
blocks do not return values to the parent function. The code inside .then
blocks execute asynchronously after the parent function completes.
JavaScript is single-threaded. Functions complete immediately. They can not return values created in .then
blocks. They can only return values that are produced immediately and synchronously or they can return pending promises that later asynchronously resolve to some value.
Expaination of Promise-Based Asynchronous Operations
console.log("Part1");
console.log("Part2");
var promise = $http.get(url);
promise.then(function successHandler(response){
console.log("Part3");
});
console.log("Part4");
The console log for "Part4" doesn't have to wait for the data to come back from the server. It executes immediately after the XHR starts. The console log for "Part3" is inside a success handler function that is held by the $q service and invoked after data has arrived from the server and the XHR completes.
For more information, see How to use $http promise response outside success handler.
Demo
console.log("Part 1");
console.log("Part 2");
var promise = new Promise(r=>r());
promise.then(function() {
console.log("Part 3");
});
console.log("Part *4*");
这篇关于如何使用Firebase的Ng-if的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!