【问题标题】:AngularJS input ng-model not updatingAngularJS输入ng-model没有更新
【发布时间】:2013-12-18 04:43:55
【问题描述】:

我正在尝试创建一个具有隔离范围的简单分页指令。出于某种原因,当我手动更改值时,它会变得有点笨拙。这是我的问题:

当我向前和向后翻页时,效果很好。太棒了

当我在该字段中输入一个页面时,它会起作用。很棒

但是,如果我在该字段中输入一个页面,然后尝试前进和后退,则在我将一个页面输入该字段后,ng-model 似乎会中断。当我没有隔离我的范围时,我让它工作了,但我对它为什么会破坏它感到困惑。这是我的代码:

HTML:

<paginate go-to-page="goToPage(page)" total-pages="results.hits.pages" total-hits="results.hits.total"></paginate>

指令:

'use strict';

angular.module('facet.directives')
    .directive('paginate', function(){
        return {
            restrict: 'E',
            template: '<div class="pull-right" ng-if="(totalPages !== undefined) && (totalPages > 0)">'+
                '<span class="left-caret hoverable" ng-click="changePage(current-1)" ng-show="current > 1"></span>&nbsp;&nbsp;Page'+
                '&nbsp;&nbsp;&nbsp;<input type="number" ng-model="current" class="pagination-input" ng-keypress="enterPage($event)"/> of'+
                '&nbsp;&nbsp;&nbsp;{{totalPages}}&nbsp;&nbsp;'+
                '<span class="right-caret hoverable" ng-click="changePage(current+1)" ng-show="current < totalPages"></span>'+
            '</div>',
            scope: {
                goToPage: '&',
                totalPages: '=',
                totalHits: '='
            },
            link: function(scope) {
                scope.current = 1;
                scope.changePage = function(page) {
                    scope.current = page;
                    window.scrollTo(0,0);
                    scope.goToPage({page:page});
                };
                scope.enterPage = function(event) {
                    if(event.keyCode == 13) {
                        scope.changePage(scope.current);
                    }
                }
            }
        }
    });

我做错了什么?

【问题讨论】:

  • 你能设置一个 jsFiddle 或 Plunkr 吗?

标签: javascript angularjs input directive


【解决方案1】:

当心ng-if - 它会创建一个新范围。如果您将其更改为 ng-show,您的示例就可以正常工作。如果您确实想使用ng-if,请创建一个对象来存储范围变量current。也许像scope.state.current这样的东西?

scope.state = {
    current: 1
};

为了避免这样的混淆,我总是将我的绑定保留为something.something,而不仅仅是something

编辑:这里有很好的解释 - http://egghead.io/lessons/angularjs-the-dot

【讨论】:

  • 该死的视频。它让我看到了我和我的团队在一些角度绑定方面遇到的许多“问题”。我们将它们归因于 html 输入的怪癖或其他原因,但我很确定丢失的点是问题所在。
  • 哦,天哪!我一直在拉我的头发,为什么它不再起作用了。我忘了ng-if 范围...
【解决方案2】:

由于 javascript 的原型层次结构,请在使用 ng-model 时始终尝试使用模型而不是使用原始类型。

angular.module('facet.directives').directive('paginate', function () {
    return {
        restrict: 'E',
        replace: true,
        template: '<div class="pull-right discovery-pagination" ng-if="(totalPages !== undefined) && (totalPages > 0)">' +
            '<span class="left-caret hoverable" ng-click="changePage(current-1)" ng-show="current > 1"></span>&nbsp;&nbsp;Page' +
            '&nbsp;&nbsp;&nbsp;<input type="number" ng-model="current.paging" class="pagination-input" ng-keypress="enterPage($event)"/> of' +
            '&nbsp;&nbsp;&nbsp;{{totalPages}}&nbsp;&nbsp;' +
            '<span class="right-caret hoverable" ng-click="changePage(current+1)" ng-show="current < totalPages"></span>' +
            '</div>',
        scope: {
            goToPage: '&',
            totalPages: '=',
            totalHits: '='
        },
        link: function(scope) {
            scope.current = {paging:1};
            scope.changePage = function(page) {
                scope.current.paging = page;
                window.scrollTo(0, 0);
                scope.goToPage({ page: page });
            };
            scope.enterPage = function(event) {
                if (event.keyCode == 13) {
                    scope.changePage(scope.current.paging);
                }
            };
        }
    };
}); 

希望这能解决你的问题:)

详情请至Understanding-Scopes

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 2018-11-14
  • 1970-01-01
  • 2014-09-07
  • 2016-10-17
相关资源
最近更新 更多