Javascript Angular不保存$scope.$watch订单
我有一个代码,负责在控制器中对元素进行排序。 代码如下:Javascript Angular不保存$scope.$watch订单,javascript,angularjs,Javascript,Angularjs,我有一个代码,负责在控制器中对元素进行排序。 代码如下: $scope.$watch('applications', function (applications) { if (angular.isArray(applications) && applications.length !== 0) { var landing_app = _.findWhere(applications, { area_name : $scope.la
$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);
}
});
当Iconsole.log
applications变量时-它具有正确的元素顺序。但它并没有被保存在视图中。这里怎么了
更新:
当我使用此代码时:
$scope.$watch('applications', function (applications) {
if (angular.isArray(applications) && applications.length !== 0) {
applications.sort(function (a) {
return a.area_name !== $scope.landingAreaName;
});
}
});
它确实改变了应用程序的顺序,但这不是我想要的顺序 问题在于变量在JS中是按值传递的,而不是按引用传递的–因此您对
应用程序的赋值仅限于本地:
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
),因为它作用于内容。您正在从外部范围重新分配应用程序
变量,这种情况最有可能是$scope。应用程序
和应用程序
指向不同的对象。您能在snippet或JSFIDLE中提供一个最小的完整代码示例吗?请添加更多导致$scope.application
更改的代码。这意味着,当我在代码中使用reject时,我创建了一个与$scope.applications无关的新对象。但是当我使用sort时,我修改了scope.applications,因为它引用了与applications变量相同的对象,对吗?事实上。您创建了一个新的局部变量,该变量与$scope
:)中的变量无关。它有它的内容,如果你直接修改应用程序[0]
,它会有不同(就像unshift一样),因为同样,内容没有被复制,非常感谢你的帮助。我忘记了应用程序不仅仅是一个数组,还是一个对象,能够通过.sort()函数修改scope.applications对我来说有点出乎意料。