Javascript 在API调用后格式化的AngularJS指令
我需要一个作为$parsers函数执行API请求的指令Javascript 在API调用后格式化的AngularJS指令,javascript,angularjs,Javascript,Angularjs,我需要一个作为$parsers函数执行API请求的指令 <input type="text" name="referer" id="referer" ng-model="Subscribe.user.referer" check-referer> 为了便于阅读,我把代码缩短了一点。服务非常简单(在服务内部): 问题是:当我在承诺加载后“返回viewValue”时,$modelValue不会改变,所以基本上承诺不会改变通过ng模型传递给指令的Subscribe.user.refere
<input type="text" name="referer" id="referer" ng-model="Subscribe.user.referer" check-referer>
为了便于阅读,我把代码缩短了一点。服务非常简单(在服务内部):
问题是:当我在承诺加载后“返回viewValue”时,$modelValue不会改变,所以基本上承诺不会改变通过ng模型传递给指令的Subscribe.user.referer。如果我返回与承诺不同的任何东西,一切都很好,因此问题就在那里,不知道如何解决它:(
如果我将要更改的值作为属性传递给指令的作用域,我没有问题。但我不想这样做:)
我对Angular不太熟悉,但我已经用了一段时间了。我花了整整一上午的时间试图自己找到答案。不走运。有点沮丧
非常感谢您的帮助。您没有将数据返回到指令中的原因是,服务需要时间将承诺返回到指令中,在这段时间内,服务器已经执行双向绑定。。这是异步调用的常见问题之一 因此,有多种解决方案,您可以使您的服务本质上是同步的
xhr.open(method, url, true);
看看这个
嵌套解决方案是
等待数据到达服务
// Make a remote request.
$http.get('some wonderful URL for a service').then(function (results) {
superImportantInfo = results;
semaphore = true;
});
while (!semaphore) {
// We're just waiting.
}
另一个解决方案是
var retrieveEventDetails = function(events) {
// events is array
var deferred = $q.defer();
var promise = deferred.promise;
var retrieveData = function(data) {
return function(){
return $http({
url: '/api/eventdetails',
method: 'POST',
data: {
event_number: data.number
},
isArray: true
})
}
}
deferred.resolve();
return events.reduce(function(promise, single_event){
return promise.then(retrieveData(single_event));
}, promise);
}
希望这有帮助 谢谢您抽出时间,先生!我真的很喜欢“另一个解决方案”,但我有点想保持它异步。我的观点是使用Angular的内置$Parser异步更新模型。很多人使用信号,我不喜欢。通过指令范围传递模型,我做到了这一点,但仍然感觉“不雅”:
// Make a remote request.
$http.get('some wonderful URL for a service').then(function (results) {
superImportantInfo = results;
semaphore = true;
});
while (!semaphore) {
// We're just waiting.
}
var retrieveEventDetails = function(events) {
// events is array
var deferred = $q.defer();
var promise = deferred.promise;
var retrieveData = function(data) {
return function(){
return $http({
url: '/api/eventdetails',
method: 'POST',
data: {
event_number: data.number
},
isArray: true
})
}
}
deferred.resolve();
return events.reduce(function(promise, single_event){
return promise.then(retrieveData(single_event));
}, promise);
}