2015-04-16 55 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