3

私はオブジェクトを持っているという奇妙な問題を抱えています - それを Person と呼びましょう - それは観測可能なプロパティ FirstName と Lastname と FullName と呼ばれる 3 番目の計算されたプロパティを持っています。私の ViewModel には、これらの Person オブジェクトの監視可能な配列があります。空の Person を配列にプッシュする関数もあります。

ここに奇妙な部分があります。

1 人を追加し、FirstName と LastName を変更すると、計算された FullName が姓と名の連結になります。これは予想される動作です。次に、別の人物オブジェクトを追加し、そのオブジェクトの FirstName または LastName プロパティを変更してから、戻って最初の人物の FirstName を変更すると、両方の Person オブジェクトの計算された FullName は、最後の Person のみの first プロパティと lastname プロパティの連結になります。

コードは次のとおりです。

function Person(data)
{
    self = this;
    self.FirstName = ko.observable(data !== undefined ? data.FirstName : "");
    self.LastName = ko.observable(data !== undefined ? data.LastName : "");
    self.FullName = ko.computed(function ()
    {
        return self.FirstName() + " " + self.LastName();
    });
};
function ViewModel() {
    var self = this;
    self.People = ko.observableArray([]);

    self.AddPerson = function()
    {
        self.People.push(new Person());        
    }
}

ko.applyBindings(new ViewModel());

...そして、次の手順を使用して、この Fiddleで問題を再現できます。

  1. 追加を押します
  2. 両方の入力にランダムなテキストを入力します
  3. ボタンの下の連結された入力を観察します
  4. 追加をもう一度押します
  5. 2 つの新しい入力のいずれかにランダムなテキストを入力します
  6. 最初の入力の 1 つの値を変更します
  7. 連結された入力がまったく同じになっていることを確認します。

この一見単純なシナリオを適切に機能させるにはどうすればよいですか?

どんな助けでも大歓迎です。前もって感謝します。

4

1 に答える 1

5

自己を囲んでいないため、グローバル変数として登録されています。自己を変更 = これ; to var self = this;

http://jsfiddle.net/AkHhJ/2/

これは私の電話ではコードを修正するのが難しいですが、動作します

var self = this;

var を指定しない場合、グローバル スコープの一部と見なされ、共有されます。

于 2013-09-04T22:49:58.510 に答える