Angularjs 角度-ng init内部不可用的数据

Angularjs 角度-ng init内部不可用的数据,angularjs,angularjs-scope,Angularjs,Angularjs Scope,角度部分-HTML。 BaseCtrl <div ng-controller="SelectTagCtrl"> <input type="text" ng-init="setTags(viewData['users'])" ui-select2="tagAllOptions" ng-model="tagsSelection" name="users" /> {{viewData['users']}} ECHOES CORRECT

角度部分-HTML。 BaseCtrl

 <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.     
Controller.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();
}

这里有两个不同的变化,似乎工作

-此版本使用文档中描述的$scope.$applyexp,在角度框架之外修改角度绑定数据时非常有用。在本例中,setTimeout是罪魁祸首

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

    $scope.$apply(function() {
        $scope.updateVal2();
    });
    console.log($scope.tagsSelection);
},5000);
-此版本使用angular的setTimeout包装,称为服务


这里有两个不同的变化,似乎工作

-此版本使用文档中描述的$scope.$applyexp,在角度框架之外修改角度绑定数据时非常有用。在本例中,setTimeout是罪魁祸首

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

    $scope.$apply(function() {
        $scope.updateVal2();
    });
    console.log($scope.tagsSelection);
},5000);
-此版本使用angular的setTimeout包装,称为服务

使用timeout将是一种变通方法,相反,我将在控制器中使用$scope变量来了解ajax调用是否已完成

问题是在ajax完成之前可能会调用ng init

我已经在angular项目中配置了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>
由于angular的魔力,元素将得到更新。现在它看到ajax请求已完成,ui if将获得一个truthy值,元素的ng init指令将有机会执行其回调

EDIT:ui-if已从中删除,现在内置了它。

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

问题是在ajax完成之前可能会调用ng init

我已经在angular项目中配置了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>
由于angular的魔力,元素将得到更新。现在它看到ajax请求已完成,ui if将获得一个truthy值,元素的ng init指令将有机会执行其回调


编辑:ui if已从中删除,但现在已内置。

这很可能是因为在编译ng init指令时,$http.get尚未完成。这取决于您在setTags中到底要做什么?我要说的是,把setTags中的逻辑移到success回调中,不要使用nginit,我试过了。这似乎很明显。但这会影响到其他事情。你想实现什么目标?我不认为这是ng init的预期用途,而是在应用程序启动之前初始化值。我不确定它是否可以用于异步调用。这可能是有可能的,也许有一些精心的使用。它会工作的想法不正确。如果我把setTags的逻辑放在success回调中。但问题是,如果我更新ng模型值,旧值就会丢失。我将用我的场景更新这个问题,这很可能是因为$http.get在编译ng init指令时尚未完成。这取决于您在setTags中到底要做什么?我要说的是,把setTags中的逻辑移到success回调中,不要使用nginit,我试过了。这似乎很明显。但这会影响到其他事情。你想实现什么目标?我不认为这是ng init的预期用途,而是在应用程序启动之前初始化值。我不确定它是否可以用于异步调用。这可能是有可能的,也许有一些精心的使用。它会工作的想法不正确。如果我把setTags的逻辑放在success回调中。但问题是,如果我更新ng模型值,旧值就会丢失。我会用我的情景更新这个问题。我发现你的答案很有用+1,但setTimeOut不是解决此问题的正确方法。我将发布我如何解决我的具体问题是的,我确实觉得我不一定回答问题本身,但很高兴它有帮助!我觉得你的答案很有用+1,但setTimeOut不是解决此问题的正确方法。我将发布我如何解决我的具体问题是的,我确实觉得我不一定回答问题本身,但很高兴它有帮助!