2

以下のようなJavaScriptコードブロックとhtmlがあります。モデル オブジェクトはジェネリックです。これは実行時に定義されます。

こんなこともありえます。

var model = { "xId": ko.observable(0), "xName": ko.observable(null), "Type": ko.observable("x") };
   /* var model = { "yId": ko.observable(0), "yName": ko.observable(null), "Type": ko.observable("y") };
    var model = { "zId": ko.observable(0), "zName": ko.observable(null), "Type": ko.observable("z") };  */

    var vm = function (data) {
        ko.mapping.fromJS(data, {}, this);
    };

    var vm2 = function () {
        var self = this;
        self.New = ko.observable(null);
        self.NewItem = function () {
            console.log(model);
            self.New(new vm(model));
        };
    };

    var viewModel = new vm2();
    ko.applyBindings(viewModel);

    vm.prototype.Save = function () {
        viewModel.New(null);
        /*In here all of inputs must be cleared but How to :)*/
    };

最初のモデルの新しいフォーム。

<input type="button" data-bind="click: NewItem" value="Add" />
<div data-bind="with:New" id="newForm">
    <input type="text" data-bind="value:xId" />
    <input type="text" data-bind="value:xName" />
    <input type="text" data-bind="value:Type" />
    <input type="button" data-bind="click: Save" value="Save" />
</div>

追加ボタンをクリックし、入力に何か入力して、保存ボタンをクリックします。newForm は非表示です。これまでのところ、すべて問題ありません。しかし、もう一度追加ボタンをクリックすると、まだ入力に値が書かれていました。保存後に newForm をクリアできません。

編集:

public class Test{
    public int TestId {get; set;}
    public int TestName {get; set;}
}

public class Test2{
    public int Test2Id {get; set;}
    public int Test2Name {get; set;}
}

エンティティ クラスの数は明確ではありません。

私のエンティティクラスはjsonに変換されています。モデルはこのように .net で作成されます。私のプロジェクトには、マスター ページとサブページがあります。テスト ページの場合:

var model = <%=ViewModelCreator.Create<Test>() %>;

test2 ページの場合:

var model = <%=ViewModelCreator.Create<Test2>() %>;
4

3 に答える 3

8

編集:あなたのビューモデルは少し奇妙です.同じオブザーバブルへの静的参照である内部モデルを持っているため、マッピングプラグインは古いオブザーバブルを見つけたときにそれらを再利用します. なぜそのようにオブザーバブルの静的に定義されたコレクションにマッピングするのですか?ビューモデルを明示的に宣言しないのはなぜですか?

古い答え はできますか?

for(var index in vm) {
   if(ko.isObservable(vm[index])) {
      vm[index](null);
   }
}

編集:クリア可能な特別なオブザーバブルを作成することもできます

于 2012-12-14T09:07:22.870 に答える
5

次のような観測値の値をクリアする必要があります。

self.propertyName('');

例:

self.XID('');
于 2013-04-25T08:06:11.143 に答える
0

コードにいくつかの設計上の問題があります。modelオブジェクトにはすでにオブザーバブルが含まれているため、マッピング プラグインを使用して変換する必要はありません。次のようにコードを更新することをお勧めします。

function vm(){
    var self = this;

    self.xId = ko.observable(0);
    self.xName = ko.observable(null);
    self.Type = ko.observable("x");    
}

var vm2 = function() {
    var self = this;
    self.New = ko.observable(null);
    self.NewItem = function() {
        self.New(new vm());
    };
};

var viewModel = new vm2();
ko.applyBindings(viewModel);

vm.prototype.Save = function() {
    viewModel.New(null);
};

ここにフィドルが働いています:http://jsfiddle.net/3uhN7/

于 2012-12-14T09:13:54.230 に答える