热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

评级系统javascript不会将结果发送到firebase

如何解决《评级系统javascript不会将结果发送到firebase》经验,为你挑选了1个好方法。

我应该是一个功能正常的脚本,努力根据它们的值推送评级,即1/5,2/5,3/5等.但是脚本根本不与firebase通信.我的Javascript是否有问题,这会阻止输入的值,按照指示发送到firebase?这是所有必要的代码.此外,还有一个指向文档头部的firebase.js的链接.

(function() {
    var firebaseUrl = "https://myFirebase.firebaseIO.com/rating";
    var itemId = (rootRef).child;
    var rootRef = new Firebase(firebaseUrl);  // Reference the Firebase location
    var itemRef = rootRef.child("items").child(itemId);     //Define itemRef as the variable for itemId in firebase
    var star = $('.rating');
    var numRatings;
        star.click(function() {     //Watch out for rating1 inside of the website and grab its value. i.e. 1, 2, 3, 4, or 5
            itemRef.child("ratings").child("numRatings").set(star.val());   //Set ratings inside of Firebase with values such as 1, 2, 3, 4, and 5, under items such as item1, item2, item3, etc... 
        });

    var cumulativeRating;
    var averageRating;
    itemRef.child("ratings").on("value", function(ratingsSnapshot) {
        var ratingsData = ratingsSnapshot.val();
        numRatings = ratingsData.numRatings;
        cumulativeRating = ratingsData.cumulativeRating;
        averageRating = cumulativeRating / numRatings;
    });
})();


    

Rated 4/5 by 103 users

Frank van Pu.. 5

你的代码中有很多小错误.我将带您了解其中的一些.但是,不要只是,请花点时间了解我实际上是如何解决这些问题的.您的第一个目标应该是能够调试自己的代码以摆脱这些更简单的错误.

好的,我会写两个问题.可能会有更多,但这已经需要足够的时间.

    处理Firebase中还没有数据的情况

    获取单击的单选按钮的值

处理Firebase中还没有数据的情况

将代码粘贴到jsbin中时发生的第一件事是它将它记录到devtools中的Javascript控制台(你得到这些F12并且在开发时应始终保持它们打开):

未捕获的TypeError:无法读取null的属性'numRatings'

这是现代Javascript的空指针异常版本,是因为你.numRatings对某些东西做了null或者undefined.幸运的是,你只有.numRatings一个地方:

itemRef.child("ratings").on("value", function(ratingsSnapshot) {
    var ratingsData = ratingsSnapshot.val();
    numRatings = ratingsData.numRatings;
    cumulativeRating = ratingsData.cumulativeRating;
    averageRating = cumulativeRating / numRatings;
});

因此它看起来ratingsData没有价值,这确实是在项目获得评级时第一次发生.在这种情况下,Firebase将value使用null(或undefined)触发事件.

处理它很容易:

itemRef.child("ratings").on("value", function(ratingsSnapshot) {
    var ratingsData = ratingsSnapshot.val();
    if (ratingsData) {
        numRatings = ratingsData.numRatings;
        cumulativeRating = ratingsData.cumulativeRating;
        averageRating = cumulativeRating / numRatings;
    }
});

在实际的实现,你可能会想一个补充elseif,并表明没有/没有足够的收视率呢.

获取单击的单选按钮的值

您将点击的值传递给Firebase的代码段是:

var star = $('.rating');
star.click(function() {
    itemRef.child("ratings").child("numRatings").set(star.val());
});

我做的第一件事是在那里添加一个日志记录语句,看看点击是否到达代码:

var star = $('.rating');
star.click(function() {
    console.log('click');
    itemRef.child("ratings").child("numRatings").set(star.val());
});

当我现在单击单选按钮时,它会记录click.所以看起来这是正确连接的.我经常会把一个Javascript debugger语句而不是console.log下一步,但这一次决定反对.

我做的下一个技巧是设置一个简单的Firebase记录器,以显示更改是否通过Firebase:

 new Firebase('https://you.firebaseIO.com/rating').on('value', function(s) { console.log(JSON.stringify(s.val())); })

您可以将其添加到脚本的顶级位置.我经常将它添加到Chrome的devtools控制台.每次Firebase的值发生变化时,都会记录下面的内容:

{"items":{"42":{"ratings":{"numRatings":"3"}}}}

或者它应该做什么,但在原始脚本中它从未这样做.所以我们进入了点击处理程序,但是这个值没有进入Firebase.

仔细检查发现了一些奇怪的东西:

var star = $('.rating');
star.click(function() {
    itemRef.child("ratings").child("numRatings").set(star.val());
});

您可以使用star此代码段第一行中的变量指向所有评级元素.但是在你执行的click处理程序中star.val(),这意味着你希望它引用一个rating元素:被点击的元素.

这里有一个关于变量名称的快速说明:通过star对包含所有评级元素的变量使用单数来设置自己的错误.我将该变量命名为stars,以表明它包含多个星星.那样你在打字时就会更容易看到有些东西闻起来stars.val().

我不是jQuery专家,但jQuery的click方法文档的快速Google 似乎表明你可以访问被点击的元素this.所以代码片段必须是:

var star = $('.rating');
star.click(function() {
    itemRef.child("ratings").child("numRatings").set($this).val());
});

有了它,我的Firebase JSON记录器开始喷出数据:

{"items":{"42":{"ratings":{"numRatings":"3"}}}}

这些值现在可以用于Firebase了!

从问题中消除技术

请注意,最后一次更改与Firebase无关.如果您尝试提醒值,也会发生这种情况:

var star = $('.rating');
star.click(function() {
    alert(star.val());
});

当您调试问题(或创建MCVE)时,这是一个关键点:尽量从问题中删除尽可能多的技术.通过从这个微小的代码片段中删除Firebase,问题就出现了"为什么我的星级评分不能进入Firebase?" "为什么这段代码片段没有显示我点击的星星的价值?" 或者一旦你掌握了它"如何获得我点击的元素的价值?".最后一个是一个问题,你可以输入谷歌并期望得到一个体面的结果,因为你不是第一个与之斗争的人.试图在Firebase上建立星级评级系统的人群要小得多.

最后

正如我已经说过的,你的脚本仍然存在问题.例如:每次点击一个单选按钮都会通过我的Firebase JSON记录器生成一对行:

{"items":{"42":{"ratings":{"numRatings":"3"}}}}
{"items":{"42":{"ratings":{"numRatings":""}}}}

因此,每次单击单选按钮时,它似乎会触发Firebase中的两个更改,第二个更改将撤消第一个更改的工作.我很确定我能弄清楚为什么会这样.但我希望通过上述课程,您将能够自己解决这个问题.

我的最终剧本:

(function() {
    var firebaseUrl = "https://your.firebaseio.com/rating";
    var itemId = 42; // TODO: look up Id of the actual item
    var rootRef = new Firebase(firebaseUrl);
    var itemRef = rootRef.child("items").child(itemId);
    var star = $('.rating');
    var numRatings;
    star.click(function() {
        itemRef.child("ratings").child("numRatings").set($(this).val());
    });

    var cumulativeRating;
    var averageRating;
    itemRef.child("ratings").on("value", function(ratingsSnapshot) {
        var ratingsData = ratingsSnapshot.val();
        if (ratingsData) {
            numRatings = ratingsData.numRatings;
            cumulativeRating = ratingsData.cumulativeRating;
            averageRating = cumulativeRating / numRatings;
        }
    });
})();

它也在jsbin上,我在那里调试:http://jsbin.com/lekifefuce/1/edit?js,output



1> Frank van Pu..:

你的代码中有很多小错误.我将带您了解其中的一些.但是,不要只是,请花点时间了解我实际上是如何解决这些问题的.您的第一个目标应该是能够调试自己的代码以摆脱这些更简单的错误.

好的,我会写两个问题.可能会有更多,但这已经需要足够的时间.

    处理Firebase中还没有数据的情况

    获取单击的单选按钮的值

处理Firebase中还没有数据的情况

将代码粘贴到jsbin中时发生的第一件事是它将它记录到devtools中的Javascript控制台(你得到这些F12并且在开发时应始终保持它们打开):

未捕获的TypeError:无法读取null的属性'numRatings'

这是现代Javascript的空指针异常版本,是因为你.numRatings对某些东西做了null或者undefined.幸运的是,你只有.numRatings一个地方:

itemRef.child("ratings").on("value", function(ratingsSnapshot) {
    var ratingsData = ratingsSnapshot.val();
    numRatings = ratingsData.numRatings;
    cumulativeRating = ratingsData.cumulativeRating;
    averageRating = cumulativeRating / numRatings;
});

因此它看起来ratingsData没有价值,这确实是在项目获得评级时第一次发生.在这种情况下,Firebase将value使用null(或undefined)触发事件.

处理它很容易:

itemRef.child("ratings").on("value", function(ratingsSnapshot) {
    var ratingsData = ratingsSnapshot.val();
    if (ratingsData) {
        numRatings = ratingsData.numRatings;
        cumulativeRating = ratingsData.cumulativeRating;
        averageRating = cumulativeRating / numRatings;
    }
});

在实际的实现,你可能会想一个补充elseif,并表明没有/没有足够的收视率呢.

获取单击的单选按钮的值

您将点击的值传递给Firebase的代码段是:

var star = $('.rating');
star.click(function() {
    itemRef.child("ratings").child("numRatings").set(star.val());
});

我做的第一件事是在那里添加一个日志记录语句,看看点击是否到达代码:

var star = $('.rating');
star.click(function() {
    console.log('click');
    itemRef.child("ratings").child("numRatings").set(star.val());
});

当我现在单击单选按钮时,它会记录click.所以看起来这是正确连接的.我经常会把一个Javascript debugger语句而不是console.log下一步,但这一次决定反对.

我做的下一个技巧是设置一个简单的Firebase记录器,以显示更改是否通过Firebase:

 new Firebase('https://you.firebaseIO.com/rating').on('value', function(s) { console.log(JSON.stringify(s.val())); })

您可以将其添加到脚本的顶级位置.我经常将它添加到Chrome的devtools控制台.每次Firebase的值发生变化时,都会记录下面的内容:

{"items":{"42":{"ratings":{"numRatings":"3"}}}}

或者它应该做什么,但在原始脚本中它从未这样做.所以我们进入了点击处理程序,但是这个值没有进入Firebase.

仔细检查发现了一些奇怪的东西:

var star = $('.rating');
star.click(function() {
    itemRef.child("ratings").child("numRatings").set(star.val());
});

您可以使用star此代码段第一行中的变量指向所有评级元素.但是在你执行的click处理程序中star.val(),这意味着你希望它引用一个rating元素:被点击的元素.

这里有一个关于变量名称的快速说明:通过star对包含所有评级元素的变量使用单数来设置自己的错误.我将该变量命名为stars,以表明它包含多个星星.那样你在打字时就会更容易看到有些东西闻起来stars.val().

我不是jQuery专家,但jQuery的click方法文档的快速Google 似乎表明你可以访问被点击的元素this.所以代码片段必须是:

var star = $('.rating');
star.click(function() {
    itemRef.child("ratings").child("numRatings").set($this).val());
});

有了它,我的Firebase JSON记录器开始喷出数据:

{"items":{"42":{"ratings":{"numRatings":"3"}}}}

这些值现在可以用于Firebase了!

从问题中消除技术

请注意,最后一次更改与Firebase无关.如果您尝试提醒值,也会发生这种情况:

var star = $('.rating');
star.click(function() {
    alert(star.val());
});

当您调试问题(或创建MCVE)时,这是一个关键点:尽量从问题中删除尽可能多的技术.通过从这个微小的代码片段中删除Firebase,问题就出现了"为什么我的星级评分不能进入Firebase?" "为什么这段代码片段没有显示我点击的星星的价值?" 或者一旦你掌握了它"如何获得我点击的元素的价值?".最后一个是一个问题,你可以输入谷歌并期望得到一个体面的结果,因为你不是第一个与之斗争的人.试图在Firebase上建立星级评级系统的人群要小得多.

最后

正如我已经说过的,你的脚本仍然存在问题.例如:每次点击一个单选按钮都会通过我的Firebase JSON记录器生成一对行:

{"items":{"42":{"ratings":{"numRatings":"3"}}}}
{"items":{"42":{"ratings":{"numRatings":""}}}}

因此,每次单击单选按钮时,它似乎会触发Firebase中的两个更改,第二个更改将撤消第一个更改的工作.我很确定我能弄清楚为什么会这样.但我希望通过上述课程,您将能够自己解决这个问题.

我的最终剧本:

(function() {
    var firebaseUrl = "https://your.firebaseio.com/rating";
    var itemId = 42; // TODO: look up Id of the actual item
    var rootRef = new Firebase(firebaseUrl);
    var itemRef = rootRef.child("items").child(itemId);
    var star = $('.rating');
    var numRatings;
    star.click(function() {
        itemRef.child("ratings").child("numRatings").set($(this).val());
    });

    var cumulativeRating;
    var averageRating;
    itemRef.child("ratings").on("value", function(ratingsSnapshot) {
        var ratingsData = ratingsSnapshot.val();
        if (ratingsData) {
            numRatings = ratingsData.numRatings;
            cumulativeRating = ratingsData.cumulativeRating;
            averageRating = cumulativeRating / numRatings;
        }
    });
})();

它也在jsbin上,我在那里调试:http://jsbin.com/lekifefuce/1/edit?js,output


推荐阅读
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
author-avatar
H小气淘淘_238
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有