【问题标题】:Angularjs: Databinding not workingAngularjs:数据绑定不起作用
【发布时间】: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


【解决方案1】:

正如我在 cmets 中提到的,发生这种情况的原因是因为 $scope.jsonData = testFactory.jsonData; 是一个 赋值,不幸的是,当这个赋值发生时,该值还不能从服务器获得.其他作业有效,因为它们是参考作业。

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

【讨论】:

猜你喜欢
  • 2014-10-21
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2017-05-02
  • 2018-03-16
相关资源
最近更新 更多