2016-10-14 12 views
1

次のJavaScriptコードを使用すると、ボタンクリック時にmodify()関数が呼び出されたときにperson.Nameプロパティが更新されないのはなぜかと思います。剣道UI MVVMの不明な動作

var person = { 
    Id: 1, 
    Name: "John" 
}; 

var model = kendo.observable({ 
    start: function() { 
    kendo.bind($("#test"), this); 
    }, 
    modify: function(){ 
    var self = this; 
    self.Name = "John Doe"; 
    console.log(self.Name); 
    console.log(person.Name); 
    } 
}); 

var person = $.extend({}, person, model); 
person.start(); 

JSFiddle LINK

答えて

2

あなただけの「修正」関数スコープで自己変数を更新しているからです。あなたは "人"変数を更新していません。 jQueryのextend関数への呼び出しは、personオブジェクトをモデルにバインド/関連付けることではありません。

あなたが望むものを達成するためにkendo.observableオブジェクトクラスを使用する例を以下に示します。

var viewModel = kendo.observable({ 
    person: { 
    id: 1, 
    name: "John" 
    }, 
    modify: function(e) { 
    console.log(viewModel.person.get("name")); 
    viewModel.person.set("name", "John Doe"); 
    console.log(viewModel.person.get("name")); 
    } 
}); 

kendo.bind($("#test"), viewModel); 

、作業jsfiddleはhereです。

注目すべき重要なポイントは、personオブジェクトがobservableオブジェクトの一部として定義されていることです。後でマージされません。また、 "get"と "set"を使用して観測値を読み取ったり更新したりすることは重要です。methods

+0

私の質問にお答えいただきありがとうございます。 私が共有したコードは、私が検討していたもっと大きなコードの簡略化されたバージョンです。私があなたが共有した例を理解していますが、それが私の質問に答えるかどうかわかりません。 私のコードで、person.start()が呼び出されたとき、私の理解は、 "this"がpersonオブジェクトを参照すべきです。 startメソッドでkendo.bindを呼び出す前にperson.Idを更新することで確認できます。 – Joe

+0

問題ありません@ジョー。最初の2つの文は問題を述べていますが、ここではさらに詳しく説明します。 $ .extendを呼び出すと、新しいオブジェクトが最初のパラメータとして使用されます。したがって、そのオブジェクトと対話しているときは、コードの最初に定義されたpersonオブジェクトと対話していません。あなたのコードスニペットをフォークして分かりやすくするためのコメントを追加しました。https://jsfiddle.net/Fresh/corovmn1/ –

+0

Hey @BenSmith、もう一度ありがとうございます。 $ .extendへの呼び出しが最初のパラメータとして新しいオブジェクトを使用していると言っていますが、このオブジェクトをpersonに再割り当てします。したがって、$ .extend(person、model)を呼び出すのと基本的に同じです。 私は問題が何かを発見したと思う:person.start()を呼び出す前に、人は観察可能なオブジェクトでなければならない。 $ .extendが観測可能なオブジェクト(モデル)を観測不可能なオブジェクト(人物)と組み合わせると、結果は観測不可能なオブジェクトになります。それを動作させる2つの方法があります:https://jsfiddle.net/bqhpfj2j/5/とhttps://jsfiddle.net/bqhpfj2j/6/ – Joe