2013-06-26 65 views
1

我有一個我通過AJAX從服務器接收到的JSON模型列表。Knockout JS ASP.NET MVC C#Model Make Observable

我不想在JavaScript中重新定義我的模型作爲函數。

我該如何防止在下面做什麼?我仍然希望所有的模型屬性都可以被觀察到。

function Car(car) { 

    this.Name = ko.observable(car.Name); 
    this.Type = ko.observable(car.Type); 
    this.Rating = ko.observable(car.Rating); 
    this.Color = ko.observable(car.Color); 
} 

var ViewModel = function() { 

    var self = this; 
    self.cars = ko.observableArray([]); 

    $.post('/car/getall', function (cars) { 

     var carsKO= []; 
     $.each(cars, function (i, elm) { 

      carsKO.push(new Car(elm)); 
     }); 

     self.cars(carsKO); 
    }); 
}; 

ko.applyBindings(new ViewModel()); 

人們在談論Knockout Mapping插件。但我沒有看到這將如何讓我與以下不同?在這一點上,我不會有模型屬性可觀察的。

var ViewModel = function() { 

    var self = this; 
    self.cars = ko.observableArray([]); 

    $.post('/car/getall', function (cars) { 

     self.cars(cars); 
    }); 
}; 

ko.applyBindings(new ViewModel()); 
+0

在你的例子中,我沒有看到ko.mapping插件的用法...我想你想寫道:'$ .post('/ car/getall',函數(汽車){ ko.mapping .fromJS(cars,{},self.cars); });'... – nemesv

+0

不要調用陣列上的映射插件。循環調用映射插件的數組並將其推送到您的observableArray。目前還沒有內置的解決方案。但是,如果您不關心除物理收集本身以外的其他值,則根本不需要觀察這些屬性。 –

回答

2

您應該使用的ko.mapping的fromJS功能是這樣的:

var ViewModel = function() { 

    var self = this; 
    self.cars = ko.observableArray([]); 

    $.post('/car/getall', function (cars) { 
     ko.mapping.fromJS(cars, {}, self.cars); 
    }); 
}; 

我希望它能幫助。

+0

這正是我所需要的,它看起來像......! – aherrick

+0

不要完全依賴它,因爲它仍然有缺陷。考慮你有一個{id:1,名字:'john',性別:{id:1,name:'male'}}的數組。結果將是可觀察的id和名稱,但性別將是具有可觀察的id和名稱的Object。沒有觀察到將性別取代爲對象。還沒有對子陣列進行測試,但我有一種感覺,他們會採取類似的行動。 –