Hotcakes Commerce 扩展 DrillDown ViewModel
Hotcakes Commerce Extending the DrillDown ViewModel
我使用的是 HC 的 v 1.10.3,我正在尝试扩展 ViewModel 以用于向下钻取视图。我想向产品添加一个新的布尔值 属性,以便我可以检查它并根据需要向视图添加一些 html。所以在 Category.js 内部,我想我会遍历数据,并将新的 属性 添加到 ViewModel,以便它可以在 View 中使用。循环是我遇到问题的地方。当我调试代码时,循环会按预期添加 属性,但是当页面加载完成并且我检查源代码时,Json 对象中存在 none 修改。
function HcDrillDownFilterViewModel(data, $form, catId, modId) {
var DECIMAL_SEP = ".";
var self = this;
for (var i = 0; i < data.Products.length; i++) {
var p = data.Products[i];
if (p.ProductName.toLowerCase().indexOf('nike') > -1) {
p.NikeBrand = true;
} else {
p.NikeBrand = false;
}
}
// Binding
self.model = ko.observable();
self.minPrice = ko.observable(data.SelectedMinPrice);
self.maxPrice = ko.observable(data.SelectedMaxPrice);
对于让这些更改持久保存到 ViewModel 我缺少什么有什么想法吗?
您 运行 只是了解 KnockoutJS 工作原理的一个小学习曲线。由于它是一个具有大量绑定和其他功能的框架,因此您需要使用它。通常,这意味着原始 JS 片段可能无法按预期工作。
老实说,我自己很少接触这个观点,因为我也不是很精通 KO,但我设法根据你的问题得到了一个概念验证。
首先,在您的代码中,您正在更新数组对象,但您只是在绑定到视图的其中一个地方更新它。它需要在两个地方完成。这是您没有看到应用更新的主要原因。
代替您的原始代码段,我已将此调用放到我在同一个 JS 文件中创建的方法中。
// update Products how you'd like
data.Products = parseProducts(data.Products);
然后,我在 handleDrillDown()
函数的顶部做了同样的事情。
// this needs to get called here too
data.Products = parseProducts(data.Products);
现在,可能有更好的方法来执行此操作,但此文件中的最终更新通过添加如下所示的函数完成了所有工作。就我而言,我使用了开箱即用的示例产品,并简单地检查了 Brown Fedora。您还会注意到我正在使用 Knockout 提供的内置 foreach。每当使用框架时都应该这样做。
function parseProducts(products) {
// instantiate a local array of products to work with
var arrProducts = products;
// loop through and apply your changes
ko.utils.arrayForEach(arrProducts, function (p) {
// check your condition
if (p.ProductName.toLowerCase().indexOf("fedora") > -1) {
p.CoolHat = true; // new property that wasn't there before
} else {
p.CoolHat = false; // new property that wasn't there before
}
});
// send back the new array
return arrProducts;
}
最后,我更新了向下钻取 Razor 视图标记,通过在产品名称后添加此代码段来查看我的更改是否按预期反映。
<span data-bind="if: CoolHat" style="font-weight:bold; color: red;">This is a really cool hat!</span>
结果是只有 Fedora 得到了 "tagged" 这个文本。
我使用的是 HC 的 v 1.10.3,我正在尝试扩展 ViewModel 以用于向下钻取视图。我想向产品添加一个新的布尔值 属性,以便我可以检查它并根据需要向视图添加一些 html。所以在 Category.js 内部,我想我会遍历数据,并将新的 属性 添加到 ViewModel,以便它可以在 View 中使用。循环是我遇到问题的地方。当我调试代码时,循环会按预期添加 属性,但是当页面加载完成并且我检查源代码时,Json 对象中存在 none 修改。
function HcDrillDownFilterViewModel(data, $form, catId, modId) {
var DECIMAL_SEP = ".";
var self = this;
for (var i = 0; i < data.Products.length; i++) {
var p = data.Products[i];
if (p.ProductName.toLowerCase().indexOf('nike') > -1) {
p.NikeBrand = true;
} else {
p.NikeBrand = false;
}
}
// Binding
self.model = ko.observable();
self.minPrice = ko.observable(data.SelectedMinPrice);
self.maxPrice = ko.observable(data.SelectedMaxPrice);
对于让这些更改持久保存到 ViewModel 我缺少什么有什么想法吗?
您 运行 只是了解 KnockoutJS 工作原理的一个小学习曲线。由于它是一个具有大量绑定和其他功能的框架,因此您需要使用它。通常,这意味着原始 JS 片段可能无法按预期工作。
老实说,我自己很少接触这个观点,因为我也不是很精通 KO,但我设法根据你的问题得到了一个概念验证。
首先,在您的代码中,您正在更新数组对象,但您只是在绑定到视图的其中一个地方更新它。它需要在两个地方完成。这是您没有看到应用更新的主要原因。
代替您的原始代码段,我已将此调用放到我在同一个 JS 文件中创建的方法中。
// update Products how you'd like
data.Products = parseProducts(data.Products);
然后,我在 handleDrillDown()
函数的顶部做了同样的事情。
// this needs to get called here too
data.Products = parseProducts(data.Products);
现在,可能有更好的方法来执行此操作,但此文件中的最终更新通过添加如下所示的函数完成了所有工作。就我而言,我使用了开箱即用的示例产品,并简单地检查了 Brown Fedora。您还会注意到我正在使用 Knockout 提供的内置 foreach。每当使用框架时都应该这样做。
function parseProducts(products) {
// instantiate a local array of products to work with
var arrProducts = products;
// loop through and apply your changes
ko.utils.arrayForEach(arrProducts, function (p) {
// check your condition
if (p.ProductName.toLowerCase().indexOf("fedora") > -1) {
p.CoolHat = true; // new property that wasn't there before
} else {
p.CoolHat = false; // new property that wasn't there before
}
});
// send back the new array
return arrProducts;
}
最后,我更新了向下钻取 Razor 视图标记,通过在产品名称后添加此代码段来查看我的更改是否按预期反映。
<span data-bind="if: CoolHat" style="font-weight:bold; color: red;">This is a really cool hat!</span>
结果是只有 Fedora 得到了 "tagged" 这个文本。