2015-10-17 104 views
0

在控制器内绑定服务/工厂变量可以很好地工作,除非工厂变量通过$ http启动。谁能解释为什么?Angularjs:数据绑定不起作用

注意:由于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

+0

'$ http'是异步的,你需要返回承诺,你试图立即返回数据,即使它还没有从服务器返回。因为这些都是原始的,而不是对象,它们不会相互“绑定”,而是试图将一个值赋值给另一个的值。 – Claies

+0

仅当从服务器接收到数据时,factory.jsonData才会更新。那时引用工厂变量的控制器变量必须自行更新? –

+0

控制器变量不会自行更新,不。这些不是对象,它们是原始的。在第一种情况下,您正在访问'factory'对象的基本属性,在第二种情况下,您正在访问'$ scope'上的基元。 – Claies

回答

1

正如我在评论中提到的那样,发生这种情况的原因是因为$scope.jsonData = testFactory.jsonData;赋值,并且不幸的是,当该赋值发生时,该值在服务器中不可用。其他作业是因为它们是参考作业。

解决此问题的一种快速但肮脏的方法是声明factory.jsonData = {};而不是factory.jsonData;。这将改变对引用赋值的调用(object to object),并允许更改为传播到另一个。

+0

内的变量我有一个类似的问题,但有一个不同的目标,希望你的意见。 http://stackoverflow.com/questions/33319779/typescript-declare-an-array-as-object-to-enable-angular-binding –