【发布时间】:2016-01-16 00:22:52
【问题描述】:
在控制器中绑定服务/工厂变量非常有效,除非工厂变量是通过 $http 启动的。谁能解释一下为什么?
注意:由于 controller.someVariable = factory.someVariable 不起作用。目前我直接引用工厂变量进行操作 factory.someVariable
控制器:
app.controller('SecondCtrl',function($scope,testFactory){
$scope.obj = testFactory.obj;
$scope.factory = testFactory;
$scope.jsonData = testFactory.jsonData; //Not Binding
//Accessing $scope.factory.jsonData works while $scope.jsonData doesn't
});
工厂:
app.factory('testFactory', ['$rootScope','$http',function ($rootScope,$http) {
var factory = {};
factory.obj = { 'name':'Jhon Doe'};
factory.jsonData;
factory.fromjson = function() {
$http.get("data.json")
.success(function(data){
factory.jsonData = data.result;
})
}
factory.fromjson();
return factory;
}]);
Plunker: http://plnkr.co/edit/wdmR5sGfED0jEyOtcsFz?p=preview
【问题讨论】:
-
$http是异步的,您需要返回承诺,即使数据尚未从服务器返回,您也试图立即返回数据。因为它们都是原语,而不是对象,所以它们没有“绑定”到彼此,你试图将一个的值分配给另一个的值。 -
factory.jsonData 仅在从服务器接收到数据时更新。那个时候引用工厂变量的控制器变量一定要自己更新吧?
-
控制器变量不会自行更新,不会。这些不是对象,它们是原语。在第一种情况下,您正在访问
factory对象的原始属性,在第二种情况下,您正在访问$scope上的原始属性。 -
你还是误会了。您的第二个选项不是 reference 分配,而是 value 分配。因此,
$scope.jsonData只能接收 值,该值存在于testFactory.jsonData在分配时。如果这些是 objects,那么它们将是一个 reference 分配。这不是角度问题,而是 javascript 分配问题。 -
这是 Angular 最常见的缺陷之一,也是经常提到但从未明确解释过的“始终使用点”论点。
标签: angularjs http data-binding binding