当前位置: 首页 > 面试题库 >

Angular JS:如何绑定到Promise

盛超
2023-03-14
问题内容

我试图将诺言与观点捆绑在一起。我不知道您是否可以直接执行此操作,但这就是我要尝试执行的操作。有什么想法我做错了吗?

注意:源代码有点超时,并使用静态数据,但这使代码更易于诊断。

编辑: JSFiddle页面:http :
//jsfiddle.net/YQwaf/27/

编辑:解决方案: 事实证明您 可以 直接绑定诺言。我的原始代码有两个问题:

  1. 使用setTimeout()而不是angular的$ timeout是一个问题。Angular不知道触发超时时需要刷新UI(您可以在setTimeout内部使用$ scope。$ apply解决此问题,也可以只使用$ timeout)
  2. 绑定到返回诺言的函数是一个问题。如果第二次被召唤,它将带来另一个承诺。更好的方法是为诺言设置作用域变量,并仅根据需要创建新的诺言。(就我而言,这是在国家/地区代码上调用$ scope。$ watch)

HTML:

<div ng:controller="addressValidationController">
    Region Code <select ng:model="regionCode" ng:options="r.code as r.name for r in getRegions()"/>
    Country Code<select ng:model="countryCode"><option value="US">United States</option><option value="CA">Canada</option></select>
</div>

JS:

function addressValidationController($scope, $q) {
    var regions = {
        US: [{code: 'WI',name: 'Wisconsin'}, {code: 'MN',name: 'Minnesota'}], 
        CA: [{code: 'ON',name: 'Ontario'}]
    };
    $scope.getRegions = function () {
        var deferred = $q.defer();
        setTimeout(function () {
            var countryRegions = regions[$scope.countryCode];
            console.log(countryRegions);
            if(countryRegions === undefined) {
                deferred.resolve([]);
            } else {
                deferred.resolve(countryRegions);
            }
        }, 1000);
        return deferred.promise;
    };
}

问题答案:

警告 :此答案在编写时是准确的,但是从1.2版本开始,Angular模板引擎无法透明地处理承诺!- @马尔沃里奥

是的,模板引擎(和表达式)透明地处理了promise,但是我会将promise分配给控制器中的作用域属性,而不是每次都返回一个返回新promise的函数(我认为这是您的问题,因为新承诺每次都会返回)。

JSFiddle:http :
//jsfiddle.net/YQwaf/36/

HTML:

<div ng:controller="addressValidationController">
    Region Code <select ng:model="regionCode" ng:options="r.code as r.name for r in regions"/>
    Country Code<select ng:model="countryCode"><option value="US">United States</option><option value="CA">Canada</option></select>
</div>

JS:

function addressValidationController($scope, $q, $timeout) {
    var regions = {
        US: [{
            code: 'WI',
            name: 'Wisconsin'},
        {
            code: 'MN',
            name: 'Minnesota'}],
        CA: [{
            code: 'ON',
            name: 'Ontario'}]
    };

    function getRegions(countryCode) {
        console.log('getRegions: ' + countryCode);
        var deferred = $q.defer();
        $timeout(function() {
            var countryRegions = regions[countryCode];
            if (countryRegions === undefined) {
                console.log('resolve empty');
                deferred.resolve([]);
            } else {
                console.log('resolve');
                deferred.resolve(countryRegions);
            }
        }, 1000);
        return deferred.promise;
    };

    $scope.regions = [];

    // Manage country changes:
    $scope.$watch('countryCode', function(countryCode) {
        if (angular.isDefined(countryCode)) {
            $scope.regions = getRegions(countryCode);
        }
        else {
            $scope.regions = [];
        }
    });
}​


 类似资料:
  • 问题内容: 目的是使产品名称出现在缩略图的工具提示中。浏览器不会根据“ ng-title”或“ ng-attr-title”创建工具提示。 我们正在使用AngularJS 1.0.7版。您可以在任何属性前面加上“ ng-”或“ ng- attr”,Angular会进行相应的绑定。但是,它似乎没有“绑定”到HTML“ A”标签的标题上。 例如 1。 码: 预期结果: 实际结果:工具提示中出现不必要的

  • 问题内容: 我有几个复选框: 我想绑定到控制器中的列表,以便每当更改复选框时,控制器都维护所有检查值的列表,例如。 ng-model似乎只能将一个复选框的值绑定到控制器中的变量。 还有另一种方法可以使四个复选框绑定到控制器中的列表吗? 问题答案: 有两种方法可以解决此问题。使用简单数组或对象数组。每个解决方案都有其优缺点。您会在下面找到每种情况的一种。 用简单的数组作为输入数据 HTML可能如下所

  • 我有几个复选框: 我希望绑定到控制器中的一个列表,这样,每当更改复选框时,控制器就会维护所有选中值的列表,例如,。 ng-model似乎只能将一个复选框的值绑定到控制器中的一个变量。 有没有另一种方法可以这样做,以便我可以将四个复选框绑定到控制器中的一个列表?

  • 问题内容: 我有一个看起来像这样的列表: 我将此列表绑定到控制器中: 当运行时,我没有任何结果。当我删除该方法时,我得到三个空行,使计数正常,但是没有显示任何信息。 我知道“其他所有东西”都可以用,因为我以前用jQuery填充了列表,我在做什么错呢? 这是服务器的响应: 问题答案: $ http方法返回一个不能迭代的promise,因此您必须通过回调将结果附加到scope变量: 现在,由于仅在获取

  • 问题内容: 我刚开始使用angularJS,并努力为我要做的事情找出合适的架构。我只有一个页面应用程序,但 URL始终应该保持不变 ;我不希望用户能够导航到根以外的任何路由。在我的应用中,有一个主要的div需要承载不同的视图。访问新视图时,我希望它接管主div中的显示。以这种方式加载的视图可以被丢弃或停留在DOM中,就像隐藏在DOM中一样- 我很想知道每个视图如何工作。 我提出了一个我想做的粗略的

  • 问题内容: 数据绑定在框架中如何工作? 我尚未在其网站上找到技术细节。数据从视图传播到模型时,或多或少地清楚了它是如何工作的。但是,AngularJS如何在没有设置者和获取者的情况下跟踪模型属性的变化? 我发现有些JavaScript观察程序可以完成这项工作。但是Internet Explorer 6和Internet Explorer 7不支持它们。那么AngularJS如何知道我更改了以下内容