Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.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 将ng模型绑定到get和set的异步函数_Javascript_Html_Angularjs_Asynchronous - Fatal编程技术网

Javascript 将ng模型绑定到get和set的异步函数

Javascript 将ng模型绑定到get和set的异步函数,javascript,html,angularjs,asynchronous,Javascript,Html,Angularjs,Asynchronous,我以前问过一个问题,但我试图解决它使它非常混乱,所以在这里我将在不尝试解决它的情况下提出它。(我的老话题在这里:) 我在浏览器插件中使用angular。我的目标是我有一个文本框。我只想允许在其中键入数字(我使用ng pattern=“^\d+$/|/[^\s*]/”完成)。我想ng model将其转换为一个函数,该函数异步获取值,并异步设置值 以下是异步set和get函数: getBrowserPref('pref-name-here', function(aPrefValue) { }) s

我以前问过一个问题,但我试图解决它使它非常混乱,所以在这里我将在不尝试解决它的情况下提出它。(我的老话题在这里:)

我在浏览器插件中使用angular。我的目标是我有一个文本框。我只想允许在其中键入数字(我使用
ng pattern=“^\d+$/|/[^\s*]/”
完成)。我想
ng model
将其转换为一个函数,该函数异步获取值,并异步设置值

以下是异步set和get函数:

getBrowserPref('pref-name-here', function(aPrefValue) { })

setBrowserPref('pref-name-here', 'value-to-set-to');

我无法用一种简单的方式完成这件事,有什么想法吗?在我的解决方案中,我必须做一些奇怪的事情,比如调用
$scope.$digest

您的示例有点难以理解,因此我制作了一个通用示例,希望可以将其塑造到您的工作副本中。这是在我相信你所追求的东西的黑暗中拍摄的。首先,
ng模式
不会阻止键入,只会触发验证。相反,从使用开始。我还猜您希望看到在
中设置的手动值,而不是键入的条目。为此,启动绑定到
ng keydown
$event.preventDefault()
。这是一个完整的工作示例,我将其包装在一个名为
async
的装饰器指令中。注意以下几点

<input type="number" async ng-keydown="sync($event)" ng-model="model" />
其中,
myService
是一个模拟服务,利用
$q
$timeout
模拟异步行为

.factory('myService', ['$q', '$timeout', function($q, $timeout) {

    function getValue () {
        var deferred = $q.defer();

        $timeout(function () {
            deferred.resolve(123);
        }, 250);

        return deferred.promise;
    }

    function setValue(value) {
        var deferred = $q.defer();

        $timeout(function () {
            deferred.resolve(value);
        }, 250);

        return deferred.promise;
    }

    return {
        getValue: getValue,
        setValue: setValue
    }
}]);
其中,
123
——样本值——通过
getValue
setValue
函数异步菊花链。如果在最终调用
ngModel.$setViewValue
ngModel.$render()
之前需要进一步操作,则
getValue
的结果也将作为参数传递给
setValue
。此外,您的目标可能是利用
getValue()
中的请求。当达到这一点时,只需注入一个服务,如
$http
,并相应地建模

function getValue () {
    return $http.get('/endpoint');
}
-工作演示-键入
1
=>500ms=>
123



如果我的假设是错误的,您希望最初阻止键入的值,您可以选择绑定到
ng change
并删除
$event.preventDefault
。如果您选择此选项,您将看到您最初键入的值,然后将按预期更改(get/set)。

如果没有所有相关代码和更具体的问题描述,问题不清楚,
无法将其拉出来。
我不理解“ng model”一词作为动词的用法(“将其建模为函数”)<代码>ng模型根据文本框值获取/设置模型。您可以使用
ng change
对文本框中的更改做出反应(或者您可以$watch绑定模型的更改)来执行一些操作,例如启动异步函数。这就是你想要的吗?这感觉很像XY问题;这个问题和前面的问题都没有清楚地解释此代码的用例,并且都使用了不正确的术语。另外,我不会确切地说调用
$scope.$digest
是“做了一些奇怪的事情”,尽管大多数时候不需要这样做……感谢@NewDev我希望每当用户更改框时发送
setPref
,每当页面被加载或聚焦时,它都应该执行
getPref
@Noitidart,然后执行
ng change=“setPref()”
和在
getPref
中,将模型设置为您需要的任何值。真诚的感谢我会仔细查看并让您知道我是如何使用它的!不客气!当你可以的时候,分享你的发现:)一定会的,这里有很多新的东西给我,我一定会有一些发现,一定会分享:)
function getValue () {
    return $http.get('/endpoint');
}