1

我試圖用knockout-sortable與映射插件將產品列表拖到另一個列表中。淘汰賽可拖曳排序映射克隆變更

這是一個非常stripped-back fiddle試圖顯示我在得到什麼。

我想要的是'購物車'中的產品參考而不是克隆'貨架'上的產品。

我已經設法通過參考貨架上的物品來計算物品的名稱,但我無法讓購物車中的產品只有他們需要的數據以供參考,沒有全部另一方面。

環顧四周,我發現這個非常誘人的解決方案由Ryan Niemeyer在similar problem幾年前,但小提琴扔出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不會被調用,所以函數甚至沒有被調用。

我也看過谷歌論壇的淘汰賽,發現this thread,這是我得到克隆位 - 但我不能讓它適合我的用例!

對於這個問題的成功答案的結果是,當購物車中只有一輛自行車時,將productArray保持原樣並將listArray設置爲[{'productID':1}]

這是我第一次發表一個關於SO的問題,所以如果我沒有讓自己清楚,請對我輕鬆點!我已經感謝社會,因爲它在解決自己的問題好多年沒有這麼有用的:)

回答

0

你會希望你的映射選項看起來是這樣的:

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

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

      return result; 
     } 
    } 
}; 

或者,你可以爲您的產品創建一個具有克隆功能的構造函數,只需返回,就像return new Product(mappingData.data);

我有上面的克隆只是返回productID作爲不可觀察,這應該沒問題,除非您需要對該值做出反應。

calculatedName功能的第一行會那麼需要是這樣的:

變種X = ko.unwrap(arg.productID);

這將檢索值是否可觀察,因此該函數可以針對productArray或listArray。

http://jsfiddle.net/rniemeyer/hLqctg4L/

+0

那個不可觀察的克隆已經成功了!在我的應用程序中,我需要有多個列表,並且您的解決方案也可以很好地應對:http://jsfiddle.net/cheersphilip/hLqctg4L/2/ – cheersphilip 2015-01-15 17:34:04