Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在API调用后格式化的AngularJS指令_Javascript_Angularjs - Fatal编程技术网

Javascript 在API调用后格式化的AngularJS指令

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

我需要一个作为$parsers函数执行API请求的指令

<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);
}