2015-10-17 107 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 –