Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 敲除可拖动可排序映射克隆更改_Javascript_Knockout.js_Knockout Mapping Plugin_Knockout Sortable - Fatal编程技术网

Javascript 敲除可拖动可排序映射克隆更改

Javascript 敲除可拖动可排序映射克隆更改,javascript,knockout.js,knockout-mapping-plugin,knockout-sortable,Javascript,Knockout.js,Knockout Mapping Plugin,Knockout Sortable,我正在尝试使用knockoutsortable和映射插件,将一个产品列表拖到另一个列表中 这里有一个非常好的例子来展示我的意思 我想要的是“购物车”中的产品参考而不是克隆“货架”上的产品 我已经设法通过引用货架上的商品来计算购物车中商品的名称,但是我很难让购物车中的商品只包含进行此引用所需的数据,而不包含所有其他残损 环顾四周后,我发现Ryan Niemeyer在几年前提出了一个非常诱人的解决方案,但小提琴抛出了404错误 我创建了一个“克隆”函数,但由于我的所有数据都已映射,因此未使用构造函数

我正在尝试使用knockoutsortable和映射插件,将一个产品列表拖到另一个列表中

这里有一个非常好的例子来展示我的意思

我想要的是“购物车”中的产品参考而不是克隆“货架”上的产品

我已经设法通过引用货架上的商品来计算购物车中商品的名称,但是我很难让购物车中的商品只包含进行此引用所需的数据,而不包含所有其他残损

环顾四周后,我发现Ryan Niemeyer在几年前提出了一个非常诱人的解决方案,但小提琴抛出了404错误

我创建了一个“克隆”函数,但由于我的所有数据都已映射,因此未使用构造函数,例如:

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
键,就可以将一个新对象放入购物车。我已经在小提琴上注释掉了这个的代码。拖动后,
console.log
不会被调用,因此该函数甚至不会被调用

我还查看了谷歌论坛上的knockout sortable并找到了,这就是我获得克隆位的地方——但我无法使它适合我的用例

成功回答此问题的结果是,当车中只有一辆自行车时,保持
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;
        }
    }
};
或者,您可以为您的产品创建一个带有克隆函数的构造函数,并返回类似于
returnnewproduct(mappingData.data)的内容

我让上面的克隆以不可观察的形式返回productID,除非您需要对该值的更改做出反应,否则这应该是好的

然后,
calculatedName
函数的第一行需要类似于:

var options = {
    productArray: {
        create: function(mappingData) {
            var result = ko.mapping.fromJS(mappingData.data);

            result.clone = function() {
                return { productID: result.productID() };
            };

            return result;
        }
    }
};
var x=ko.unwrap(参数productID)

这将检索值,无论它是否可见,因此函数可以针对productArray或listArray工作


那个不可见的克隆人已经成功了!在我的应用程序中,我需要有多个列表,您的解决方案也能很好地处理这一点: