敲除可拖动可排序映射克隆更改
knockout draggable sortable mapping clone alteration
我正在尝试使用带有映射插件的 knockout-sortable 将产品列表拖到另一个列表。
这里有一个非常 stripped-back fiddle 来展示我的意思。
我想要 'cart' 中的产品参考,而不是克隆 'shelf' 中的产品。
我已经设法通过参考货架上的商品来计算购物车中商品的名称,但是我无法让购物车中的商品仅具有进行此引用所需的数据,而没有所有其他的东西。
环顾四周,我发现 Ryan Niemeyer 在几年前对 similar problem 提出了这个非常诱人的解决方案,但是 fiddle 抛出了 404 错误!
我已经创建了一个 'clone' 函数,但是因为我所有的数据都被映射了,所以它没有使用构造函数,例如:
var product = function(ID, name, other){
this.productID = ko.observable(ID);
//etc.
};
这意味着我不能做我想做的事情,即:
product.prototype.clone = function(){
var x = ko.mapping.toJS(this);
delete x.productName;
delete x.someOtherData;
ko.mapping.fromJS(x);
};
我希望将一个新对象放入购物车,仅引用原始 productID
键。我已经在 fiddle 中注释掉了代码。 console.log
拖动后没有被调用,所以函数甚至没有被调用。
我还在 Google 论坛上查看了 knockout-sortable 并找到了 this thread,这是我从中获得克隆位的地方 - 但我无法使其适合我的用例!
成功回答此问题的结果是,当购物车中只有一辆自行车时,productArray
保持原样,并将 listArray
设置为 [{'productID':1}]
。
这是我第一次在 SO 上发帖提问,如果我没有说清楚,请宽容我!我已经对社区感激不尽,因为多年来它对解决我的问题非常有帮助 :)
您希望您的映射选项看起来像:
var options = {
productArray: {
create: function(mappingData) {
var result = ko.mapping.fromJS(mappingData.data);
result.clone = function() {
return { productID: result.productID() };
};
return result;
}
}
};
或者,您可以为您的产品创建一个带有克隆功能的构造函数,并且 return 类似于 return new Product(mappingData.data);
我上面的克隆只是 return productID 作为不可观察的,这应该没问题,除非您需要对该值的变化做出反应。
您的 calculatedName
函数的第一行需要类似于:
var x = ko.unwrap(arg.productID);
这将检索值是否可观察,因此该函数可以针对 productArray 或 listArray。
我正在尝试使用带有映射插件的 knockout-sortable 将产品列表拖到另一个列表。
这里有一个非常 stripped-back fiddle 来展示我的意思。
我想要 'cart' 中的产品参考,而不是克隆 'shelf' 中的产品。
我已经设法通过参考货架上的商品来计算购物车中商品的名称,但是我无法让购物车中的商品仅具有进行此引用所需的数据,而没有所有其他的东西。
环顾四周,我发现 Ryan Niemeyer 在几年前对 similar problem 提出了这个非常诱人的解决方案,但是 fiddle 抛出了 404 错误!
我已经创建了一个 'clone' 函数,但是因为我所有的数据都被映射了,所以它没有使用构造函数,例如:
var product = function(ID, name, other){
this.productID = ko.observable(ID);
//etc.
};
这意味着我不能做我想做的事情,即:
product.prototype.clone = function(){
var x = ko.mapping.toJS(this);
delete x.productName;
delete x.someOtherData;
ko.mapping.fromJS(x);
};
我希望将一个新对象放入购物车,仅引用原始 productID
键。我已经在 fiddle 中注释掉了代码。 console.log
拖动后没有被调用,所以函数甚至没有被调用。
我还在 Google 论坛上查看了 knockout-sortable 并找到了 this thread,这是我从中获得克隆位的地方 - 但我无法使其适合我的用例!
成功回答此问题的结果是,当购物车中只有一辆自行车时,productArray
保持原样,并将 listArray
设置为 [{'productID':1}]
。
这是我第一次在 SO 上发帖提问,如果我没有说清楚,请宽容我!我已经对社区感激不尽,因为多年来它对解决我的问题非常有帮助 :)
您希望您的映射选项看起来像:
var options = {
productArray: {
create: function(mappingData) {
var result = ko.mapping.fromJS(mappingData.data);
result.clone = function() {
return { productID: result.productID() };
};
return result;
}
}
};
或者,您可以为您的产品创建一个带有克隆功能的构造函数,并且 return 类似于 return new Product(mappingData.data);
我上面的克隆只是 return productID 作为不可观察的,这应该没问题,除非您需要对该值的变化做出反应。
您的 calculatedName
函数的第一行需要类似于:
var x = ko.unwrap(arg.productID);
这将检索值是否可观察,因此该函数可以针对 productArray 或 listArray。