2014-11-01 87 views
1

我刚开始用角,并有一个简单的问题:通知角变量已经改变

var data = JSON.parse('[{"name": "Joe","account": "12355845454","rent": "500"}]'); 

angular.module('ngAppRentManager', []). 
controller('RentCtrl', ['$scope', function ($scope) { 
    $scope.tenants = data; 
}]); 

setTimeout(function() { 
    data = JSON.parse('[{"name": "Sara","account": "54874","rent": "600"}]'); 
    console.log("Poke Angular!"); 
}, 2000); 

当我的变量data发生了变化。我如何让Angular更新模型?

Fiddle

+1

见$超时服务。这可以确保你的角度知道你的异步操作。 – Subin 2014-11-01 12:49:49

+0

或调用$ scope.apply()来询问角度来检查数据,并更新绑定。 – Subin 2014-11-01 12:50:26

+0

@Subin $ scope在当前上下文中没有定义,我该如何引用它?我没有做任何异步btw,当用户在文件输入中加载csv文件时,我正在更改'data'。我应该采取不同的方式吗? – Jonathan 2014-11-01 12:52:27

回答

3

广告。适用()你这样的代码

var data = JSON.parse('[{"name": "Joe","account": "12355845454","rent": "500"}]'); 

angular.module('ngAppRentManager', []). 
controller('RentCtrl', ['$scope', function ($scope) { 
    $scope.tenants = data; 

    setTimeout(function() { 
    $scope.tenants = JSON.parse('[{"name": "Sara","account": "54874","rent": "600"}]'); 
    console.log("Poke Angular!"); 
    $scope.$apply(); 
}, 2000); 

}]); 

http://jsbin.com/tirebavaho/1/

+0

不会工作...... – andlrc 2014-11-01 12:48:13

+0

它确实 - 检查jsbin示例 – 2014-11-01 12:55:25

+3

我在写完评论后改变了整个答案。在它是'data = JSON.parse(...)'之前'您下次发布时,请检查您的代码,然后再发布,而不是之后... – andlrc 2014-11-01 13:15:36

2

使用$timeout服务留内angular context

var data = JSON.parse('[{"name": "Joe","account": "12355845454","rent": "500"}]'); 

angular.module('ngAppRentManager', []). 
controller('RentCtrl', ['$scope', '$timeout', function ($scope, $timeout) { 
    $scope.tenants = data; 
}]); 

$timeout(function() { 
    data = JSON.parse('[{"name": "Sara","account": "54874","rent": "600"}]'); 
    console.log("Poke Angular!"); 
}, 2000); 
+0

[http://support.microsoft.com/kb/26689447/notify-angular-a-variable-has-changed/26689794?#comment41998544_26689794) – Jonathan 2014-11-02 18:13:22

0

我发现我的问题

var data = JSON.parse('[{"name": "Joe","account": "12355845454","rent": "500"}]'); 

angular.module('ngAppRentManager', []). 
controller('RentCtrl', ['$scope', '$timeout', function ($scope, $timeout) { 
    $scope.tenants = data; 
    $scope.getData = function (newData) { 
     $scope.tenants = newData; 
     $scope.$apply(); 
    }; 
}]); 

setTimeout(function() { 
    data = JSON.parse('[{"name": "Sara","account": "54874","rent": "600"}]'); 
    console.log("Poke Angular!"); 
    // Is this the best way to call Angular from outside scope? 
    angular.element($('#control')).scope().getData(data); 
}, 2000); 

工作的解决方案如果这可以通过直接调用控制器加以改进,请让我知道。

Fiddle

+0

JimmyRare的回答是正确的。在使用角度时不需要使用#id。不需要使用DOM操作NOR处理元素时应该使用角度 – harishr 2014-11-02 18:03:49

+0

我在实际中并没有'timeout'的用法我想在控制器之外的函数之后更新我的视图解析了一个CSV文件。 – Jonathan 2014-11-02 18:06:58

+0

请勿在角度上下文中使用scope.apply,这会使您的方法附加到控制器作用域上,从角度来看不可用(因为它将引发相位错误)。因此,理想情况下,scope.apply必须在源中调用,而不是在受影响的函数中调用。也就是说,你会在setTimeout中执行你的情况。此外2秒的超时会给你带来什么?如果你的过程需要更多的时间,甚至更少的时间让用户等待,该怎么办? – PSL 2014-11-02 18:12:24

0

您可以使用$scope.$watch

$scope.$watch("data", function (newVal, oldVal) { 
    //your update code 
    //newVal is your data's changed value 
});