2012-06-13 19 views
1

SuperNoob在這裏,試圖加載不同的多個「選項」作爲一個字符串[]或對象,可以添加到使用Knockout購物車的「產品」:(從John Papa的PluralSight Knockout Change跟蹤的例子) 這裏是視圖:如何將嵌套的JSON/C#數組加載到視圖模型中?使用Knockout,jQuery

<div> 
    <span>OptionsArray: </span> 
    <ul data-bind="foreach: optionsArray"> 
     <li data-bind="text: $data"></li> 
    </ul> 
</div> 

這裏是JSON轉換成C#:

{Id = 4, ModelId = 1, SalePrice = 1.00, ListPrice = 1.00, Rating = 5, Photo = "smallCoffee.jpg", CategoryId = 1, ItemNumber = "smallCoffee", Description = "Small Coffee", Model = new Model(){ Name = "Small Coffee", Brand = "Tim Hortons", Id = 1 }, Category = drinkCat, Options = new Options(){Name = "Sugar"}, OptionsArray = new string[]{"Sugar", "Cream"}} 

該JavaScript功能工作,裝載JSON成產品的 「產品」 陣列,除了我可以讓它通過不同的多個選項來迭代每個產品。 這裏是視圖模型的功能部分:

loadProductsCallback = function (json) { 
      my.vm.tracker().markCurrentStateAsClean(); 
      $.each(json, function (i, p) { 
       products.push(new my.Product(selectedProduct)        
         .id(p.Id) 
         .salePrice(p.SalePrice) 
         .photo(p.Photo) 
         .category(new my.Category() 
         .id(p.Category.Id) 
         .name(p.Category.Name) 
          ) 
         .model(new my.Model() 
         .id(p.Model.Id) 
         .name(p.Model.Name) 
         .brand(p.Model.Brand) 
          ) 
         .options(new my.Options() 
         .name(p.Options.Name) 
          )        
         .description(p.Description) 
         .rating(p.Rating) 
         .stateHasChanged(false); 
         $.each(p.OptionsArray, function(i, o) { p.optionsArray.push(o);}); 
       ); 
      }); 

這裏是把所有的數據Product對象:

Product = function (selectedItem) { 
    var self = this; 
    self.id = ko.observable(); 
    self.salePrice = ko.observable(); 
    self.photo = ko.observable(); 
    self.model = ko.observable(); 
    self.options = ko.observable(); 
    self.optionsArray = ko.observableArray(["1", "2"]); 
    self.category = ko.observable(); 
    self.description = ko.observable(); 
    self.rating = ko.observable(); 
    self.isSelected = ko.computed(function() { 
     return selectedItem() === self; 
    }); 
    self.isDrink = ko.computed(function() { 
     return this.category() ? this.category().id() === 1 : false; 
    }, self), 
    self.isFood = ko.computed(function() { 
     return this.category() ? this.category().id() === 4 : false; 
    }, self), 

    self.shortDesc = ko.computed(function() { 
     return this.model() ? this.model().name() : ""; 
    }, self), 
    self.opt = ko.computed(function() { 
     return this.options() ? this.options().name() : ""; 
    }, self), 
    self.optQty = ko.computed(function() { 
     return this.options() ? this.options().qty() : ""; 
    }, self), 
    self.photoUrl = ko.computed(function() { 
     return photoPath + this.photo(); 
    }, self), 
    self.rating.subscribe(function() { 
     this.stateHasChanged(true); 
    }, self), 
    self.stateHasChanged = ko.observable(false); 
}; 

的loadProductsCallback功能工作除了部分添加嵌套罰款OptionsArray in。我試過一個嵌套的$ .each函數,只是簡單的.optionsArray(p.OptionsArray)。

還有很多代碼:我希望這足以說明問題。

尊敬的堆疊器,如何正確使用此函數將OptionsArray加載到Products對象中?

+0

你如何在你的可觀察屬性上進行鏈接?也似乎有一些錯誤的括號。你有沒有考慮使用映射插件爲你做這個? – madcapnmckay

+0

我不確定鏈接可以擴展多一點嗎?可能括號可能不匹配,因爲我剪切並粘貼出來,我會再次檢查。映射插件看起來非常方便,但是由於現在所有其他工作都正在進行,因此我試圖在繼續之前瞭解該模型的工作原理。我覺得如果我能弄清楚如何加載這個數組,那麼我會更好地理解KO。 –

+0

我只是查詢產品屬性的映射。新的my.Product(selectedProduct).id(p.Id).salePrice(p.SalePrice),因爲id屬性必須返回產品才能鏈接salePrice屬性的設置。 – madcapnmckay

回答

1

不知道我很理解你的代碼,但在這裏。

您正在創建一個產品,然後嘗試循環收集並將其映射到選項。除了將結果推送到源對象。

這是怎麼回事。

loadProductsCallback = function (json) { 
    my.vm.tracker().markCurrentStateAsClean(); 
    $.each(json, function (i, p) { 
     var newProduct = new my.Product(selectedProduct)        
       .id(p.Id) 
       .salePrice(p.SalePrice) 
       .photo(p.Photo) 
       .category(new my.Category() 
       .id(p.Category.Id) 
       .name(p.Category.Name) 
        ) 
       .model(new my.Model() 
       .id(p.Model.Id) 
       .name(p.Model.Name) 
       .brand(p.Model.Brand) 
        ) 
       .options(new my.Options() 
       .name(p.Options.Name) 
        )        
       .description(p.Description) 
       .rating(p.Rating) 
       .stateHasChanged(false); 
     $.each(p.OptionsArray, function(i, o) { 
      newProduct.optionsArray.push(o); 
     }); 

     products.push(newProduct); 
    }); 
} 

希望這會有所幫助。

+0

謝謝,你創建一個var的方式,並使2 $。每個通話都有效!另外,OptionsArray在javascript控制檯中未定義,因此我將產品定義和JSON更改爲:'new Product(){Id = 4,ModelId = 1,SalePrice = 1.00,ListPrice = 1.00,Rating = 5,圖片=「smallCoffee.jpg」,CategoryId = 1,ItemNumber =「smallCoffee」,說明=「小咖啡」,Model = new Model(){Name =「Small Coffee」,Brand =「Tim Hortons」,Id = 1} ,類別= drinkCat,OptionsArray =新列表(){new Options(){Name =「Cream」},new Options(){Name =「Sugar」}}}' –

+0

對不起沒有足夠的代表upvote你的解決方案,但我保證在2分後回來。 –

相關問題