2014-09-11 133 views
0

我是AngularJs的新手,我有一个简单的问题。我想把这个名字。但是这个名字起初有一个价值,但在0.3-0.5秒之后它有其他价值。我不知道如何绑定它,价值可能会改变。AngularJs异步数据绑定

HTML代码:

<div ng-controller="FormController"> 
    <h2 > 
     {{getName()}}<br> 
     <span class="icon-f-gear"></span> 
     <small>Procesas</small> 
    </h2> 
</div> 

角控制器:

var App = angular.module('form', ['ui.bootstrap']); 

App.controller('FormController', ['$scope' ,'$http', function($scope, $http) { 

    $scope.tasks = []; 
    $scope.socket.stomp.subscribe("/app/tasks", function (message) { 
     if ($scope.tasks.length !=0){ 
      $scope.tasks.removeAll(); 
     } 
     JSON.parse(message.body).forEach(function (el) { 
      $scope.tasks.push(el); 
     }); 
    }); 
    $scope.getName = function(){ 
     return $scope.tasks[0].form.name; 
    }; 

我使用STOMP协议,它给我的数据不会立即,因为它有发送请求到服务器,并把它找回来, 这需要时间。我试图在请求变量$ scope.tasks [0] .form.name从undefined更改为“Institution”后进行调试,但在屏幕上未定义停留,如何绑定变量以便更改该值。提前感谢您的帮助!

UPDATE 问题解决了,我只需要使用$ scope.apply(...)函数。代码在这里:

var App = angular.module('form', ['ui.bootstrap']); 

App.controller('FormController', ['$scope' ,'$http', function($scope, $http) { 

    $scope.tasks = []; 
    $scope.socket.stomp.subscribe("/app/tasks", function (message) { 
     if ($scope.tasks.length !=0){ 
      $scope.tasks.removeAll(); 
     } 
     JSON.parse(message.body).forEach(function (el) { 
      $scope.tasks.push(el); 
     }); 
     $scope.apply(function(){$scope.tasks}); 
    }); 
    $scope.getName = function(){ 
     return $scope.tasks[0].form.name; 
    }; 

感谢您的帮助!

回答

2

很可能订阅回调没有在角度上下文中被调用。尝试包回调代码$scope.$apply,看看它是否工作

$scope.socket.stomp.subscribe("/app/tasks", function (message) { 
    $scope.$apply(function() { 
     if ($scope.tasks.length !=0){ 
      $scope.tasks.removeAll(); 
     } 
     JSON.parse(message.body).forEach(function (el) { 
      $scope.tasks.push(el); 
     }); 
    }); 
    }); 
+0

非常感谢您!我用这个$ scope.apply(...)函数,一切正常。虽然我只是在变量上使用它:$ scope。$ apply(function(){$ scope.tasks}; – Egizeris 2014-09-11 13:47:44

0

我相信你调用返回未定义的方法,因为它没有任何数据。 换句话说,给它一个初始值,它应该工作

我将它改写为:

<div ng-controller="FormController"> 
    <h2> 
     {{formName}}<br> 
     <span class="icon-f-gear"></span> 
     <small>Procesas</small> 
    </h2> 
</div> 

而且

App.controller('FormController', ['$scope' ,'$http', function($scope, $http) { 

$scope.formName = ''; 
--- rest of code 

或者,如果你想保持它在('FormController',['$ scope','$ http',function($ scope,$ http){

$scope.tasks = []; 
$scope.tasks[0].form.name = ''; 

$scope.getName = function(){ 
    return ($scope.tasks.length > 0) ? $scope.tasks[0].form.name : ''; 
}; 

我希望这有助于

+0

感谢您的时间,但我之前也尝试过,它没有改变模型,以前的答案建议使用$ scope.apply(...)用作魅力。 – Egizeris 2014-09-11 13:44:27