2015-04-16 114 views
1

我試着搜索類似於我的問題,但無法得到任何結果。如果這個問題重複並且已經得到解答,請原諒。

我的HTML有名字和姓氏兩個輸入字段和一個按鈕:

<body ng-app="myApp" > 
    <div ng-controller="myCtrl"> 
    <input type="text" ng-model="fname"/> 
    <input type="text" ng-model="lname"/> 
    <input type="button" ng-click="createObj();" value="Clear Scope"/> 
    <p>Fname = {{fname}}</p> 
    <p>Lname = {{lname}}</p> 
</div> 

這是具有控制器功能我的JS文件:

var myApp = angular.module("myApp", []); 
myApp.controller("myCtrl",function($scope){ 

    $scope.fname = "sandeep"; 
    $scope.lname = "nayak"; 

    $scope.createObj= function(){ 

    var obj = {fn:$scope.fname, ln: $scope.lname}; 
    console.log(obj); 

    $scope.fname = ""; 
    $scope.lname = ""; 

    console.log(obj); 

    }; 


}); 

createObj方法中,我創建了一個包含名和姓的對象,然後清除$ scope。

我在清除$ scope之前和之後記錄了兩次對象。但我沒有看到任何區別。

即使在我清除$ scope後,爲什麼對象仍然相同,因爲我在對象中引用$ scope?

http://jsfiddle.net/7eo4zcvq/

+2

你是不是指範圍的對象,你是從指定範圍的屬性到你的對象(這是按值傳遞) – Chandermani

回答

5

這是不相關的角度,而只是爲Javascript本身。

當你寫

var obj = {fn:$scope.fname, ln: $scope.lname}; 

$ scope.fname/L-NAME被解析到他們的價值,這是字符串,那麼這個對象恰好是事實上初始化爲

var obj = {fn:"sandeep", ln:"nayak"}; 

所以清除範圍對它沒有任何影響:這是因爲字符串不像普通對象那樣對待,而是像本地類型(與數字和布爾相同)。

此行爲的一個簡單的例子是:

var a = "hello"; 
var b = a; 
a = "world"; 
console.log(a);  // outputs "world" 
console.log(b);  // outputs "hello" 
console.log(a === b); // outputs false 
1

您需要使用的FNAME和LNAME新值OBJ再次更新變量。清除fname和lname的值不會對obj產生任何影響。請參閱下面的更新代碼。

var myApp = angular.module("myApp", []); 
myApp.controller("myCtrl",function($scope){ 
    $scope.fname = "sandeep"; 
    $scope.lname = "nayak"; 

    $scope.createObj = function(){ 
     var obj = {fn:$scope.fname, ln: $scope.lname}; 
     console.log(obj); 

     $scope.fname = ""; 
     $scope.lname = ""; 
     var obj = {fn:$scope.fname, ln: $scope.lname}; 

     console.log(obj); 
    } 



}); 
0

在清除範圍後更新obj的值;你將不得不手動更新obj,通過@Joshua阿文緯度建議或您可能喜歡的fnln到函數轉換:

var myApp = angular.module("myApp", []); 
myApp.controller("myCtrl",function($scope){ 
$scope.fname = "sandeep"; 
$scope.lname = "nayak"; 

$scope.createObj = function(){ 
    var obj = {fn:function() {return $scope.fname;} , ln: function() {return $scope.lname;} }; 
    console.log(obj.fn()); 
    console.log(obj.ln());  

    $scope.fname = ""; 
    $scope.lname = ""; 

    console.log(obj.fn()); 
    console.log(obj.ln());  

} 

});

工作實施例:http://jsfiddle.net/7eo4zcvq/2/

0

有存儲基準更簡單的方法。在$scope中定義一個對象,而不是原始類型的變量。

$scope.person = { 
    fname: "sandeep", 
    lname: "nayak" 
} 

$scope.createObj = function(){ 
    var obj = { 
     person: $scope.person, 
     toString: function(){ 
      return this.person.fname + ' ' + this.person.lname; 
     }}; 
    console.log(obj.toString()); 

    $scope.person.fname = "a"; 
    $scope.person.lname = "a"; 

    console.log(obj.toString()); 
} 

更新jsfiddle