knockout.js 如何让我的Knockout代码正确绑定

yuvru6vn  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(319)

我用KnockoutJS 3.4.2构建了一个购物车页面,我在最新的Chrome中测试了这个页面,购物车中的产品是用 AJAX 加载的。
然后将购物车填充到HTML表中。
由于某种原因,当我在TD中绑定'productTitle'时,它可以工作,但当我试图在span中绑定它时,它不能工作。我还尝试使用模板:<span><!--ko text: productTitle--><!--/ko--></span>但这也行不通。
这是否与页面加载时observableArray可能仍然为空的事实有关?我发现,当我将“productTitle”放入TD文本绑定时,文本可以工作。
另外,由于某些原因,可观察计数不会绑定到数据绑定值的输入。
下面是我的代码:
HTML语言

  1. <tbody data-bind="foreach: productsInCart">
  2. <tr data-bind="attr: {productOptionId: productOptionId}">
  3. <td></td>
  4. <td class="cart-title" data-bind="text: productTitle"></td>
  5. <td data-bind="text: price"></td>
  6. <td>
  7. @*<span><!--ko text: productTitle--><!--/ko--></span>*@
  8. <div click-action="" class="qtyminus"></div>
  9. <input type='text' name="quantity" data-bind="value: count" class="qty"/>
  10. <div click-action="" class="qtyplus"></div>
  11. </td>
  12. <td class="cart-total" data-bind="text: total"></td>@*
  13. <td><a href="@Url.Action("RemoveProductOption", "ShoppingCart", new {id = product.ProductOptionId})" class="cart-remove"></a></td>*@
  14. </tr>
  15. </tbody>

JS系统

  1. $(function () {
  2. var productInCart = function(data) {
  3. var self = this;
  4. self.productOptionId = ko.observable(data.ProductOptionId);
  5. self.price = ko.observable(data.Price);
  6. self.count = ko.observable(data.Count);
  7. self.productBrandName = ko.observable(data.ProductBrandName);
  8. self.productOptionName = ko.observable(data.ProductOptionName);
  9. self.productName = ko.observable(data.ProductName);
  10. self.productFriendlyUrl = ko.observable(data.ProductFriendlyUrl);
  11. self.productTitle = ko.computed(function () {
  12. return self.productName() + " " + self.productOptionName();
  13. });
  14. self.total = ko.computed(function () {
  15. return self.count() * self.price();
  16. }, self);
  17. return self;
  18. }
  19. function viewModel() {
  20. var self = this;
  21. self.productsInCart = ko.observableArray([]);
  22. $.ajax({
  23. type: "GET",
  24. url: window.cartUrl,
  25. dataType: "json",
  26. contentType: 'application/json; charset=utf-8',
  27. traditional: true, //// traditional option to true
  28. success: function (result) {
  29. console.log(result);
  30. ko.utils.arrayForEach(result, function (data) {
  31. self.productsInCart.push(new productInCart(data));
  32. });
  33. console.log(self.productsInCart());
  34. }
  35. });
  36. }
  37. var vm = new viewModel();
  38. ko.applyBindings(vm);
  39. });

AJAX 正在加载的对象:

  1. [
  2. {
  3. ShoppingSessionId: 2061,
  4. ProductOptionId: 3,
  5. Price: 26.95,
  6. Count: 1,
  7. ProductBrandName: "G-Star",
  8. ProductOptionName: "Maat 36/36",
  9. ProductName: "G-Star Loose, 340166",
  10. ProductFriendlyUrl: "g-star-3301-loose-dus",
  11. TaxId: 1,
  12. TaxRate: 21,
  13. FirstProductImageId: 7,
  14. Id: 48
  15. }
  16. ]

无法绑定错误之一:

  1. Uncaught ReferenceError: Unable to process binding "value: function (){return count }"
  2. Message: count is not defined
  3. at value (eval at parseBindingsString (knockout-3.4.2.js:280), <anonymous>:3:58)
  4. at m (knockout-3.4.2.js:470)
  5. at Function.Uc (knockout-3.4.2.js:204)
  6. at Function.Vc (knockout-3.4.2.js:201)
  7. at Function.U (knockout-3.4.2.js:200)
  8. at Object.a.m.a.B (knockout-3.4.2.js:193)
  9. at init (knockout-3.4.2.js:472)
  10. at knockout-3.4.2.js:309
  11. at Object.w (knockout-3.4.2.js:149)
  12. at knockout-3.4.2.js:308
1l5u6lss

1l5u6lss1#

注意:到这里,这个问题是由第三方库(StackTable)引起的,它增加了KO绑定。
看起来你的代码是剃刀?我注意到<span></span>被注解掉了。这是你提到的有问题的span吗?
如果是这样的话,我建议将绑定放在<span>元素本身上。我不确定文本绑定是否支持虚拟标记的使用。
替换:

  1. <span><!--ko text: productTitle--><!--/ko--></span>

具有:

  1. <span data-bind="text: productTitle"></span>

此外,作为一种“最佳实践”的方法,我不会将元素单独推入数组。每次推入都会导致knockout重新评估依赖关系,并将/可能导致重绘(即对性能不太好)。相反:
1.构建一个本地普通旧JavaScript数组。
1.把东西放进去。
1.将可观察数组的值设置为刚刚构建的本地数组的值。
我还将对foreach进行逻辑检查,以确定该数组不是null/undefined或空的。

展开查看全部

相关问题