我有一个$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 对话框如下所示:
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
范围(我的应用程序只有一个控制器 - 它不是太大)。
所以我们可以说:$rootScope
是$scope
主控制器的父级,同时也是$scope
' ngDialog
s 的父级$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]);