1

Angular パーシャル - 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();
}
4

2 に答える 2

3

timeout代わりに、コントローラ内の変数を使用$scopeして、ajax 呼び出しが完了したかどうかを確認します。

問題はng-init、ajax の完了前に呼び出される可能性があることです。

私はすでにui-ifAngularプロジェクトでディレクティブを構成していたので、それを変数の組み合わせで使用して$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 ディレクティブがそのコールバックを実行する機会を得ることがわかります。

EDIT :現在組み込まれているng-ifを優先して、Angular UIui-ifから削除されました。

于 2013-05-21T11:50:57.870 に答える
2

動作しているように見えるフィドルへの2つの異なる変更を次に示します。

Fiddle 1 - このバージョンは、こちら$scope.$apply(exp)のドキュメントで説明されているように使用され、角度フレームワークの外部で角度バインドされたデータを変更する場合に役立ちます。この例では、犯人です。setTimeout

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

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

Fiddle 2 - このバージョンは、 $timeoutサービスsetTimeoutと呼ばれる角度のラッパーを使用します。

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

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