2013-10-02 50 views
0

我正在使用MVC4填充複雜的視圖模型。我填充這樣使用添加/刪除來綁定表的數據綁定問題

var job = @Html.Raw(Json.Encode(Model.job)); 
var customer = @Html.Raw(Json.Encode(Model.customer)); 
var listTasks = @Html.Raw(Json.Encode(Model.Tasks)); 
var estimateMaterials = @Html.Raw(Json.Encode(Model.estimateMaterials)); 
var estimate = @Html.Raw(Json.Encode(Model.estimate)); 

var JobPost = { 
    customer: customer, 
    job: job, 
    listTasks: ko.observableArray(listTasks), 
    estimateMaterials: ko.observableArray(estimateMaterials), 
    estimate: ko.observable() 
}; 
ko.applyBindings(JobPost, document.getElementById("update-job-form")); 

現在,對象estimateMaterials被填充到行。而該行,我想在表的底部這樣

Image of the table

然後我看見,rniemeyer wonderful fiddle上添加/刪除易行添加Remove到每一行和Add button
叉形小提琴是:http://jsfiddle.net/codovations/tDV9k/

在有這樣的

self.addLine = function() { self.lines.push(new CartLine()) }; 
self.removeLine = function(line) { self.lines.remove(line) }; 

一個片段,我想實現類似的東西,以我的觀察到的陣列
estimateMaterials: ko.observableArray(estimateMaterials)

這是可能的像這樣添加方法?

P.S:我通過使用jquery分別克隆一行/刪除最接近的tr來添加/刪除。我正在尋求一種更乾淨的方式。

更新:

我這裏面臨的主要問題是如何訪問對象的observableArray

+0

是的,它可以添加它們,但是你有什麼樣的問題?你得到一個錯誤?有些東西不起作用?還有什麼? – nemesv

+0

@nemesv:對不起,如果你還不明白我是否無能爲力。我認爲這可以做到。但我不知道在哪裏添加它。我在這裏描述了我的思維過程。我做了數千次迭代,最後把問題抽象出來。 – naveen

回答

1

我可能錯誤地理解你的問題,看看下面的,讓我知道如果您有任何疑問

function EstimateMaterialLine() { 
    var self = this; 
    self.EstMatlID = ko.observable(); 
    //other observables to follow 
} 
var job = @Html.Raw(Json.Encode(Model.job)); 
var customer = @Html.Raw(Json.Encode(Model.customer)); 
var listTasks = @Html.Raw(Json.Encode(Model.Tasks)); 
var estimateMaterials = @Html.Raw(Json.Encode(Model.estimateMaterials)); 
var estimate = @Html.Raw(Json.Encode(Model.estimate)); 

var JobPostViewModel = function(){ 
    var self = this; 
    self.customer = ko.observable(customer); 
    self.job = ko.observable(job); 
    self.listTasks = ko.observableArray(listTasks); 
    self.estimateMaterials = ko.observableArray(estimateMaterials); 
    self.estimate = ko.observable(estimate); 
    self.removeEstimateMaterial = function(line) { 
     self.estimateMaterials.remove(line) 
    }; 
    self.addEstimateMaterial = function() { 
     self.estimateMaterials.push(new EstimateMaterialLine()) 
    }; 
}; 
var model = new JobPostViewModel(); 
ko.applyBindings(model, document.getElementById("update-job-form")); 

因此,可以說你有一個表,那麼你可以使用它像這樣:

<table data-bind="foreach: estimateMaterials"> 
    <tr> 
     <td> <input type="button" value="delete" data-bind="click: $root.removeEstimateMaterials"/> </td> 
    <tr> 
</table> 
<input type="button" value="Add" data-bind="click: $root.addEstimateMaterials"/> 
+0

謝謝隊友。這正是我之後所做的。讓我稍微準備一下。隨時回滾 – naveen

+0

@naveen不是我的客人,你知道你的代碼比我會做的更好 – Armand

+0

你的謙虛令我驚歎。再次感謝。我對'knockoutjs'很陌生。只有一個月。那也不是全職的。它非常強大。我只做了一次改變'estimateMaterials.push(new EstimateMaterialLine())'而不是對象。它將保證一個新的對象引用權利? – naveen