【问题标题】:how to use dynamic variable in update.js shopify如何在 update.js shopify 中使用动态变量
【发布时间】:2022-01-04 09:49:45
【问题描述】:

我希望你在 update.js 中使用测试变量,但是当我用作变量时它显示错误但是当我直接传递这个值时它可以工作 有人可以告诉我如何使用动态变量来更改购物车中现有产品的数量

我已经更新了我的代码它将只允许用户添加 5 个项目超过 5 个项目将被删除它将创建如下所示的字符串 32082238341235:0,39470423048307:0,32164693278835:0,32164693835891:1

最后所有的 ID 和数量都会被 update.js 更新

我在最后一步显示错误 {"status":404,"message":"购物车错误","description":"找不到变体"}

当我尝试更新所有产品时

jQuery.getJSON('/cart.js', function(cart) {
  var items_new = cart.items;
  var count = 0;
  count = cart.item_count;
  var item_to_remove = count - 5;

  if (count > 5) {
    var item_to_remove = count - 5;
    var combine = ""
    if (item_to_remove > 0) {
      for (var i = 0; i < items_new.length; i++) {
        if (count > 5) {
          var c_id = items_new[i].variant_id;
          var c_quantity = items_new[i].quantity;

          if (c_quantity >= item_to_remove) {


            var q = c_quantity - item_to_remove
            var data_multiple = c_id + ":" + q + ",";


            debugger;



            count = count - item_to_remove;
            console.log(data_multiple);
            var combine = combine + data_multiple;

          } else {

            var data_single = c_id + ":" + 0 + ",";

            count = count - c_quantity;
            item_to_remove = item_to_remove - c_quantity
            console.log(data_single)

            var combine = combine + data_single;
          }

        }

      }


      console.log(combine.slice(0, -1));
      var test = combine.slice(0, -1);

      console.log({
        updates: {
          test
        }
      });
      jQuery.post('/cart/update.js', {
        updates: {
          test
        }
      });





    }
    t._rerenderCart()

  }
  t.sidebarDrawer.open()
});
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;

【问题讨论】:

  • 从哪里调用这个 getJSON 函数?
  • @kiner_shah 这是shopify的默认设置它会获取所有购物车数据
  • 看起来您正在combine 变量中构建一个字符串,最终成为test 变量。因此,test一个字符串,类似于 "794864229:0,794864101:5"。你需要它是一个实际的对象。另外,{ updates: { test } }{ updates: { test: "whatever the value of test is" } } 的简写,与{ updates: test } 不同。 (这是相关的,因为 test 不是有效的 variant_id。)现在,您会得到类似 { updates: { test: "794864229:0,794864101:5" } } 的输出。
  • 正如@natancodes 指出的那样,您应该将适当的对象传递给更新,而不是字符串。
  • 我会通过将var combine = "" 更改为var combine = {} 来接近它。从那里开始,您可以将属性分配给对象,而不是像 data_multiple 这样构造字符串。

标签: javascript arrays json api shopify


【解决方案1】:

您需要将test 存储为括号{} 内的对象,然后使用扩展... 运算符传递给updates

var test = {39470423048307 : 0, 32164693278835 : 0, 32164693835891 : 1};
console.log({updates: {...test}});
jQuery.post('/cart/update.js', {updates:{...test}});
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;

在您更新的代码中,您将一个字符串传递给updates,而不是一个对象。您应该从 for 循环内的数据创建一个对象,并将该对象传递给updates。见// CHANGE HERE:

...
var combine = {};
if (item_to_remove > 0) {
  for (var i = 0; i < items_new.length; i++) {
    if (count > 5) {
      var c_id = items_new[i].variant_id;
      var c_quantity = items_new[i].quantity;

      if (c_quantity >= item_to_remove) {


        var q = c_quantity - item_to_remove;
        
        // CHANGE HERE
        combine[c_id] = q;
        
        count = count - item_to_remove;

      } else {
        // CHANGE HERE
        combine[c_id] = 0;

        count = count - c_quantity;
        item_to_remove = item_to_remove - c_quantity;
      }
      console.log(combine);
    }

  }

  // CHANGE HERE
  var test = combine;

  console.log({
    updates: test
  });
  jQuery.post('/cart/update.js', {
    updates: test
  });
...

【讨论】:

  • 确实如此,尽管展开运算符并非绝对必要。即{ updates: test } 应该也能正常工作。
  • @natancodes,哦,是的,你是对的 :-)
  • @kiner_shah 试过了它显示 {"status":404,"message":"Cart Error","description":"Cannot find variant"} 错误
  • @natancodes,Spread 运算符可能很有用,例如在更新也应该包含其他数据的情况下。
  • @kiner_shah 谢谢兄弟,它有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
相关资源
最近更新 更多