2016-02-18 51 views
0

我有一個代碼負責排序控制器中的元素。 下面是代碼:

$scope.$watch('applications', function (applications) { 
    if (angular.isArray(applications) && applications.length !== 0) { 
     var landing_app = _.findWhere(applications, { 
      area_name : $scope.landingAreaName 
     }); 
     applications = _.reject(applications, function(app){ 
      return app.id == landing_app.id; 
     }); 
     applications.unshift(landing_app); 
    } 
}); 

當我console.logapplications變量 - 它具有的元件的正確順序。但它並沒有保留在視圖中。這裏有什麼問題?

更新:

,當我使用此代碼:

$scope.$watch('applications', function (applications) { 
    if (angular.isArray(applications) && applications.length !== 0) { 
     applications.sort(function (a) { 
      return a.area_name !== $scope.landingAreaName; 
     }); 
    } 
}); 

它確實改變應用程序的順序,但它不是我想要的順序。

+0

您正在重新分配來自外部作用域的'applications'變量,這種情況很可能是'$ scope.applications'和'applications'指向不同的對象。您能否在代碼片段或jsfiddle中提供最小的完整代碼示例? –

+1

請增加更多導致'$ scope.application'變化的代碼。 –

回答

0

的問題是,變量是按值傳遞,而不是引用,在JS - 讓你的分配application是當地唯一:

var x = 3; 
(function (x) { 
    x++; // x = 4 
}(x)); 
// here, back to x = 3 

所以,這也正是「點的規則」來自於角:

var obj = {x: 3}; 
(function (obj) { 
    obj.x++; // obj.x = 4 
}(obj)); 
// obj.x is still 4 here, because obj's **contents** weren't copied. 

在這種情況下,最簡單的解決方案是修改$scope

$scope.applications = _.reject(...); 

注意:任何破壞性操作都會起作用(如unshift),因爲它會對內容起作用。

+0

這意味着,當我在代碼中使用拒絕時,我創建了一個新的對象,它與$ scope.applications沒有關係。但是,當我使用排序時,我正在修改範圍應用程序,因爲它引用與應用程序變量相同的對象,對嗎? – naneri

+0

確實。你創建了一個新的局部變量,這與'$ scope' :)中的變量無關。它有它的內容,如果你直接修改'applications [0]'** **,它會產生變化(就像不移動一樣),因爲再一次,內容不會被複制 – Ven

+0

好的,非常感謝您的幫助。我忘記了應用程序不僅是一個數組,而且也是一個對象,並且能夠通過.sort()函數修改scope.applications對我來說是一件意外的事情。 – naneri