$rootScope.$apply()
ラッピング呼び出し (SDK.api) によってラップされる関数があります。
SDK.api('/me', function(response) {
//THIS callback, anonymous function, is wrapped by SDK in $rootScope.$apply
$scope.form = {
'first_name' : response.first_name,
'last_name' : response.last_name,
'email' : response.email
};
$scope.formEnabled = true;
$scope.formFetching = false;
});
実際、これは Facebook JS SDK (プレーンな FB オブジェクトではない) のラッパーであり、そのような関数は のコンテキストで呼び出されます$rootScope.$apply()
。$scope.$apply()
そのような関数の最後でを使用するとエラーが発生するため、これを確認でき"inprog"
ます (つまり、 への呼び出し$apply
内で呼び出すことはできません$apply
)。
コード内のこの$scope
オブジェクト (つまり、ここに記述したコード チャンク) は、ngDialog
プラグイン用に作成したコントローラーに属しています。ng-dialog は次のようになります。
return ngDialog.open({
template: url + 'partials/dialog-form.html',
className: 'ngdialog-theme-plain',
scope: $scope,
closeByDocument: true,
closeByEscape: true,
showClose: true,
cache: false,
controller: ['$scope', '$http', function($scope, $http) {
/* ... more ... */
$scope.formFetching = true;
$scope.formEnabled = false;
$scope.success = false;
SDK.api('/me', function(response) {
$scope.form = {
'first_name' : response.first_name,
'last_name' : response.last_name,
'email' : response.email
};
$scope.formEnabled = true;
$scope.formFetching = false;
});
/* ... more ... */
}]
})
$scope
inはメインコントローラーからのscope: $scope
スコープです (私のアプリにはコントローラーが 1 つしかありません - 大きすぎません)。
したがって、次のように言えます:$rootScope
は$scope
メイン コントローラーの親であり、同時に の の親でも$scope
あります。ngDialog
$scope
grandchild$scope
では、form
データが更新されます。
$scope.form = {
'first_name' : response.first_name,
'last_name' : response.last_name,
'email' : response.email
};
url + 'partials/dialog-form.html'
そして、実際に存在してレンダリングされるテンプレートがあります。内容は次のとおりです(不要なコードは省略します)。
<div id="pedido">
<form novalidate ng-submit="submitForm()">
<!-- more code -->
<table width="100%">
<!-- more code -->
<tbody>
<tr>
<td>Nombre:</td>
<td>
<input type="text" ng-model="form.first_name" />
<span ng-repeat="error in errors.first_name" class="error">{{ error }}</span>
</td>
</tr>
<tr>
<td>Apellido:</td>
<td>
<input type="text" ng-model="form.last_name" />
<span ng-repeat="error in errors.last_name" class="error">{{ error }}</span>
</td>
</tr>
<tr>
<td>Correo electrónico:</td>
<td>
<input type="text" ng-model="form.email" />
<span ng-repeat="error in errors.email" class="error">{{ error }}</span>
</td>
</tr>
<!-- more code -->
</tbody>
</table>
<!-- more code -->
</form>
</div>
の値を仮定するとng-submit
、ng-repeat
存在します。
私の問題: のフィールドにng-model
値が入力されていません$scope.form
。
私の質問:何が間違っていますか?フォームは正常に機能し、サーバー側のデータは正常に受信されます。*** での私の唯一の問題は、これらのフィールドが$rootScope.$apply
呼び出されたときに反映されないことです-Facebook から事前に入力されたそのようなフィールドが必要です (Facebook からそのようなデータを取得するのに問題はありません: $window.console.log
)。
付録の編集: API 呼び出し
var SDK = function($scope) {
this.$scope = $scope;
this._initialized = false;
this._calls = [];
};
/* ... */
SDK.prototype.api = function(path, method, params, callback) {
var c = this;
this._makeCall(function(){
FB.api(
c.wrap(path),
c.wrap(method),
c.wrap(params),
c.wrap(callback)
);
});
};
/* ... */
SDK.prototype.wrap = function(call) {
var c = this;
return (typeof call !== 'function') ? call : function(){
c.$scope.$apply(call);
};
};
/* ... */
FBModule.factory('AngularFB.SDK', ['$rootScope', sdk]);