1

角部分 - HTML。基本控制

 <div ng-controller="SelectTagCtrl">       
     <input type="text" ng-init="setTags(viewData['users'])" ui-select2="tagAllOptions" ng-model="tagsSelection" name="users"  />   
     {{viewData['users']}} ECHOES CORRECTLY. 
     But undefined when passed inside ng-init callback.
 </div>

 <input type="text" class="span12" placeholder="Brief Description" name="description" value="{{viewData['description']}}">
 ECHOES CORRECTLY.     

控制器.js

function SelectTagCtrl(){
 $scope.setTags = function(data){       
    // data is undfined when viewData['users'] is used. <-- PROBLEM
    // correct when I pass some static string. 
 }     
}


//POPULATING viewData to be used inside view partial.  

function BaseCtrl(){
    $http.get(url).success(function(data){   
    $scope.viewData = data.data || [];        
    $scope.view_type = $scope.viewData['view_type'];
    $scope.fields = data.data.fields;                   
    console.log($scope);

  }).error();
}
4

2 回答 2

3

使用timeout将是一种解决方法,相反,我会$scope在控制器内部使用一个变量来了解 ajax 调用是否已完成。

问题ng-init可能是在 ajax 完成之前被调用。

我已经ui-if在我的角度项目中配置了指令,所以我将它与$scope变量的组合一起使用以使事情正常工作。

<div ng-controller="SelectTagCtrl" ui-if="ajax_done">       
     <input type="text" ng-init="setTags(viewData['users'])" ui-select2="tagAllOptions" ng-model="tagsSelection" name="users"  />  
</div>

在控制器内部,

 $http.get(gurl + '.json').success(function(data,status){
      // some stuff
      $scope.ajax_done = true;
 }).error();

由于 Angular 神奇的双向绑定,元素会得到更新。现在它看到 ajax 请求已完成,ui-if将获得一个真实值,并且元素的 ng-init 指令将有机会执行其回调。

编辑ui-if已从Angular UI中删除,取而代之的是现在内置的ng-if 。

于 2013-05-21T11:50:57.870 回答
2

这是您的小提琴的两个不同更改,它们似乎有效。

Fiddle 1 - 此版本按照此处$scope.$apply(exp)文档中的描述使用,当您在角度框架之外修改角度绑定数据时很有用。在这个例子中是罪魁祸首。setTimeout

setTimeout(function(){
    console.log("updateVal" );

    $scope.$apply(function() {
        $scope.updateVal2();
    });
    console.log($scope.tagsSelection);
},5000);

Fiddle 2 - 这个版本使用 Angular 的包装器来setTimeout调用$timeout服务。

$timeout(function(){
    console.log("updateVal" );

    $scope.updateVal2();
    console.log($scope.tagsSelection);
},5000);
于 2013-05-16T05:57:21.113 回答