【问题标题】:Update dynamically created object value without page refresh在不刷新页面的情况下更新动态创建的对象值
【发布时间】:2018-08-02 18:39:22
【问题描述】:

这可能是一个愚蠢的问题(没有愚蠢的问题是不正确的).. 但是这里有。我会列出我在做什么:

1) 用户登录到一个页面,首先发生的是使用 php 从 MySQL 数据库中提取对象列表。它通过 json_encode() 返回一个对象数组。

然后页面为每个对象动态构建一个 DOM 元素,并通过 jQuery $('container').append(.....> 附加到一个容器中。这通过一个循环和一个被分配的 php 变量发生作为一个javascript变量..代码的重要部分:

 for(var i = 0, len = userObjects.length; i < len; i++){
     var currentObject = userObjectsObjects[i];
     var isCurrentFavorite = isFavorite(currentObject.isFavorite);

     var ratings = buildRatingString(currentObject.ratings, currentObject.raters);

    if(count % 4 !=0){
        $(".content").append('<div class=col-md-3>.............');   
        count++;
    }else if(count % 4 == 0){
        $(".content").append('<div class=col-md-3>........');
        count++;
    }
    $(".content").append('</div></div>');
}

这会构建一个 DOM 元素并放置相应的 currentObject。放到适当的位置并显示在页面上。

所有这些都很好。不理想(我愿意接受有关如何优化该过程的建议,因为这对我来说似乎很复杂),但它确实有效。

我的问题:

用户可以点击一颗心来添加到他们的收藏夹中。点击点击一个函数,在该函数中检查对象当前是否被收藏,并通过 ajax 调用采取适当的操作。

目前我知道如何获取 objectId 的唯一方法是将其设置为收藏夹按钮的 id。单击按钮(隐藏且心形图标位于其位置)时,它将该信息发送到函数 toggleFavorites() 并将信息发送到数据库..即..

<button type="button" id="'+currentObject.objectId+'"></button>  

代码:(objId是上面按钮分配的id^^^^^)

function toggleFavorite(objId, isFav){
var value = isFav;
var objectId= objId;

    var toTable = '';
    if(value == 'Y'){
        toTable = 'N';
    }else if(value == 'N'){
        toTable = 'Y';
    }
ajaxIt(toTable, recipeId);
    function ajaxIt(toTable, objectId){
                $.ajax({
                        type: 'post',
                        url: '../PHP/update_favorite.php',        
                        data: {isFavorite: toTable, objectId: objectId},      
                        success: function(){
                             if($('#heart' + objectId).hasClass("redClass")){
                                    $('#heart' + objectId).addClass('grayClass')                                      
                                    $('#heart' + objectId).removeClass("redClass");

                                }else if($('#heart' + objectId).hasClass("grayClass")){
                                    $('#heart' + objectId).removeClass("grayClass");
                                    $('#heart' + objectId).addClass('redClass');


**I WANT TO UPDATE THE OBJECT IN HERE**
                                }  

                }
            });
    return false;        
    }

}

此变量的设置取决于对象当前是否为收藏夹……即在初始对象拉取时。所以,如果它当前是收藏夹并且用户点击了心脏.. var toTable 将 = 'N' (从收藏夹中删除).. 反之亦然。

我在ajax成功函数中手动设置了心形颜色,但是我遇到了这个问题,需要更改实际对象:

如果对象当前是收藏夹,则在拉取对象时用 isFavorite: 'Y' 表示。您单击心脏,ajax 正确地将“N”发送到表.. 我已确认有效。心由红色变为灰色。如果您在不刷新页面的情况下再次单击心脏以添加到收藏夹,isFavorite 仍然是“Y”(未使用更新的表值提取新对象)并且它仍然向表发送“N”。

是否可以像这样更新动态创建的对象,以便在调用 toggleFavorite() 函数时,它具有正确的表值?

对不起,这太罗嗦了……我没有编程知识或词汇,还不够简洁。

【问题讨论】:

    标签: javascript ajax object dynamic


    【解决方案1】:

    您的实现实际上很复杂,可以使用任何前端框架(如 angular 1/2/4/5 或 reactjs 或其他)进行简化。

    对于使用纯 JQuery,您应该更新对象而不是更新 DOM。 更新对象后,你就已经知道要更新的 id 对应的 DOM 和更新相同了。或者创建一个函数来获取新对象并重新渲染整个 DOM 部分。首先是优选的。我知道这只是一些伪逻辑,但这很简单,不需要任何解释。我很乐意聊天以解释更多。此外,如果您使用框架,那将非常简单。只需尝试查看任何框架 hello world 示例。

    【讨论】:

    • @Lansana 是的,这就是为什么我想只使用伪逻辑。 :)
    • 好的,谢谢。我会看看你提到的框架。我输入的越多,我就越意识到我的代码是多么复杂。
    • @MarcusHolden 别担心,在框架出现之前,每个代码库看起来都或多或少像您示例中的代码:P。这是一个很好的起点。但是,是的,框架绝对是完成这项工作的正确工具,因为您想要进行复杂的 DOM 操作。即使是轻量级框架也可以工作。
    • 也只是为了理解目的,最好不使用任何框架先解决这个问题。
    猜你喜欢
    • 2017-03-24
    • 2022-11-27
    • 2017-05-11
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多