2016-03-26 17 views
2

私はAngularJSでWebアプリケーションを開発しています。私はJavaScriptのリファレンスについて混乱しています。オブジェクトの変更がその参照に影響を与えるのはいつですか?オブジェクトJavaScriptの値とオブジェクト配列

たとえば、私のアプリにはコントローラがあります。私はそのコントローラを使ってファイルをアップロードし、ファイル情報を工場に保存します。

私はファイルオブジェクトをfileArrayにプッシュします。その後、ファイルオブジェクトに新しい属性を変更したり追加したりすると、fileArrayでその変更を見ることができます。

var fileInfo = { 
    infoArray : $scope.fileArray 
} 

fileFactory.keepFileInfo(fileInfo); 

私はそのアレイを工場で保管します。しかし、$ scope.fileArrayの今回の変更は工場に反映されません。ここでの論理は何ですか?私が間違っていた

EDIT

。コントローラーオブジェクトエフェクトファクトリーの変更。私はこの最小限のアプリケーションを書いてそれをはっきりと見せてくれました。

var testApp = angular.module('testApp', []); 

testApp.controller('TestController', function($scope, TestFactory) { 
    $scope.fileArray = []; 

    var files = []; 
    files[0] = { 
     parameters : { 
      name : 'file1.txt', 
      path : "user/files" 
     } 
    } 

    $scope.fileArray.push(files[0]); 

    files[1] = { 
     parameters : { 
      name : 'file2.txt', 
      path : "user/files" 
     } 
    } 

    $scope.fileArray.push(files[1]); 

    files[2] = { 
     parameters : { 
      name : 'file3.txt', 
      path : "user/files" 
     } 
    } 

    $scope.fileArray.push(files[2]); 

    TestFactory.setFileArray($scope.fileArray); 

    files[0].parameters["name"] = "changed file name"; 

    console.log($scope.fileArray); //here writes "changed file name"  
    console.log(TestFactory.getFileArray()); //here writes "changed file name", too 
}); 


testApp.factory('TestFactory', function() { 
    var factory = {}; 

    var fileArray = []; 

    factory.setFileArray = function(files) { 
     fileArray = files; 
    } 

    factory.getFileArray = function() { 
     return fileArray; 
    } 

    return factory; 
}); 
+0

すべての関連コードを表示してください。工場で$スコープがないのでコントローラで工場配列を共有しているとは思われません – charlietfl

答えて

-1

のは、次の例を考えてみましょう:あなたがオブジェクト変数を持っていて、そこに別のオブジェクトのメンバーを割り当てた場合

var a = {}; 
var b = {c: a}; 
console.log(a === b.c); 
a.d = {}; 
console.log(b.c); 

は、その後、彼らは非常に同じ参照を持っているので、あなたはどちらか変更した場合もう一方は変更されます。配列でこれを行う場合も同じです:

var a = {}; 
var b = [a]; 
console.log(a === b[0]); 
a.d = {}; 
console.log(b[0]); 
+2

これはOPの工場とコントローラにどのように結びついていますか? – charlietfl

+0

@charlietfl、良い質問です。彼が私たちにもっと情報を与えている限り、私の答えは編集されるでしょう。それまで私は一般的な情報だけを助けることができます。 –

+1

はい、しかし*一般的な情報*は質問のコメントセクションに属します。質問が明確でない場合は、質問の下のコメントセクションを使用して説明を求めてください。質問に答えている場合にのみ、回答セクションを使用していることを確認してください。 –

関連する問題