2017-02-09 9 views
0

誰かが私にこの奇妙なjsの動作を説明できますか?Javascriptオブジェクトが変更されなかった理由

このすべてはAngularJSです。

私は単にそのIDによって配列から要素を返すために私のメインapp.jsでのヘルパー関数を持っている:

var MyLib = MyLib || {}; 

MyLib.helpers = { 
    find: function(needle, stack) { 
     for (var i = 0; i < stack.length; i++) { 
      if(stack[i]._id === needle) 
       return stack[i]; 
     } 
     return false; 
    } 
} 

それから私は、データベースの変更を処理するための工場や機能を持っている:

// categories are grabbed from db 
var categories = [some array of objects]; 


// change is object returned from database that has all info about object as well as new object itself 
function handleChange(change) { 
    var _category = MyLib.helpers.find(change.id, categories); 

    // if deleted, that part is ok 
    if(change.deleted) { 
     var idx = categories.indexOf(_category); 
     if(idx !== -1) { 
      categories.splice(idx, 1); 
     } 
    } else { 
     // if updated that part is weird 
     if(_category) { 
      _category = change.doc; 
     } 
     // if newly added that part is ok 
     else { 
      categories.push(angular.copy(change.doc)); 
     } 
    } 
} 

なぜカテゴリから取得した要素を更新しようとすると、配列はカテゴリ配列内で更新されませんか?

// categories ARE NOT updated after this 
_category = change.doc; 

と私はこのようなインデックスでカテゴリを参照するときにのみ:

// categories ARE updated after this although _category is returned from this array by index (find function) 
var idx = categories.indexOf(_category); 
categories[idx] = change.doc; 

私はこのことを理解していない...

+1

使用して、既存のオブジェクトを更新でき、新しいオブジェクトを元のオブジェクトの値を上書きする

。以前のオブジェクトの値への参照がなくなった – charlietfl

答えて

1

変数を新しい値で上書きしていて、以前の値への参照がなくなりました。代わりに、あなたは、単に新しい値を持つ変数の値を上書きしているangular.extend()

angular.extend(_category, change.doc); 
+0

私は今それを得る。私は、この場合には上書きされた参照が存続すると考えました。ありがとうございました。 – goldjunge

0

私はすべてを分析していなかったが、あなたは常にべきドット表記があります。

値によって

_categoryパス、および変更されません 'MyLib.helは...' 参照によって

var _category = MyLib.helpers.find(change.id, categories); 

something.categoryパスを変更し、場合「MyLib.helを変更します... 'が変更されました

var something.category = MyLib.helpers.find(change.id, categories); 
関連する問題