2016-04-04 7 views
0

問題は、サーバ上でIDを受け取らないため、新規に作成したアイテムを更新できないことです。ノックアウトで新しく作成されたアイテムのIDを設定する方法

私はノックアウトを学ぼうとしており、新しい作成アイテムにIDを提供する方法を見つけることができません。

knockoutを使用してオブジェクトを作成していますが、新しいアイテムを挿入した後に名前を変更しようとするとId値がないため、できません。

私の質問は:新しいアイテムを追加するたびに、アイテムの新しいコレクションをビューに戻す必要があり、ビューを再バインドする必要がありますか?

または、新しい挿入アイテムにIDを提供する別の方法がありますか?ここで

は私のコードです:

function Person(id, name) { 
    var self = this; 
    self.Id = ko.observable(id); 
    self.nume = ko.observable(name); 


} 

function PersonVm() { 
    var self = this; 



self.Persons = ko.observableArray([]); 


self.newPerson = ko.observable(new Person()) 
self.isModificare = false; 

self.addPerson = function() { 

    if (!self.isModificare) { 
     $.ajax("/Person/AddPerson", { 
      data: ko.toJSON({ Person: self.newPerson }), 
      type: "post", contentType: "application/json", 
      success: function (result) { alert(result.mesaj); } 
     }); 
    } else { 
     $.ajax("/Person/UpdatePerson", { 
      data: ko.toJSON({ Person: self.newPerson }), 
      type: "post", contentType: "application/json", 
      success: function (result) { alert(result) } 
     }); 
    } 
    self.isModificare = false; 


    if (!self.isModificare) self.Persons.unshift(self.newPerson()); 
    self.newPerson(new Person()); 


} 
self.removePerson = function() { 
    $.ajax("/Person/DeletePerson", { 
     data: ko.toJSON({ Person: self.newPerson }), 
     type: "post", contentType: "application/json", 
     success: function (result) { alert(result) } 
    }); 
    self.Persons.remove(self.newPerson()); 
    self.newPerson(new Person()); 


} 

self.ModificaPerson = function (person) {   
    self.newPerson(person); 
    self.isModificare = true; 

} 

$.getJSON("/Person/GetPersons", function (allData) { 
    var mapPerson = $.map(allData, function (item) { return new Person(item.Id,item.Name) }); 
    self.Persons(mapPerson); 
}); 
} 

ko.applyBindings(new PersonVm()); 

編集:

これは図である:あなたが欲しいものを得るために

<div class="input-group"> 

     <input type="text" class="form-control" data-bind="value: newPerson().name"> 
     <span class="input-group-btn"> 
      <button class="btn btn-default" data-bind="click:addPerson"> 
       <span class="glyphicon glyphicon-plus-sign" style="color:green"></span> 
      </button> 
     </span> 
     <span class="input-group-btn"> 
      <button class="btn btn-default" data-bind="click:$root.removePerson"> 
       <span class="glyphicon glyphicon-trash" style="color:red"></span> 
      </button> 
     </span> 
    </div> 



<ul data-bind="foreach: Perons" class="list-group" id="content"> 
    <li class="list-group-item" data-bind="text: name,click:$root.ModificaPerson"></li> 
</ul> 
+0

あなたは 'addPerson'バインディングを持っているビューを表示することができます –

答えて

1

2つのステップ:

  1. "Person/AddPerson" Webサービスが、作成されたオブジェクトのIDを返すことを確認します。

    $.ajax("/Person/AddPerson", { 
        data: ko.toJSON({ Person: self.newPerson }), 
        type: "post", contentType: "application/json", 
        success: function (result) { 
         self.newPerson().Id(result.Id); 
        } 
    }); 
    

注上記のコードは、あなたのサービスは、ID」という名前のIDプロパティでJSONオブジェクトを返すことを想定していること:それはnewPersonプロパティにIDを設定するよう

  • は、あなたの更新方法を変更

    '

  • +0

    私はこれを試しましたが動作していません(はい、私はアイドルの応答でアイドルを持っています) –

    +0

    "それは動作していません "とはどういう意味ですか? –

    +0

    新しい項目を挿入した後、コントローラはIDを送信していますが、同じ項目を更新しようとすると、更新アクションはその項目をコントローラに戻します。 –

    関連する問題