2017-02-09 95 views
0

有人能解释我这个奇怪的js行为吗?为什么Javascript对象没有改变?

所有这一切都在AngularJS中。

我在我的主要app.js辅助函数来简单地从一个阵列通过id返回元素:

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); 
相关问题