Javascript 将ng模型绑定到get和set的异步函数
我以前问过一个问题,但我试图解决它使它非常混乱,所以在这里我将在不尝试解决它的情况下提出它。(我的老话题在这里:) 我在浏览器插件中使用angular。我的目标是我有一个文本框。我只想允许在其中键入数字(我使用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
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');
}