首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角绑定到只读属性。

问角绑定到只读属性。
EN

Stack Overflow用户
提问于 2015-04-20 17:36:29
回答 2查看 3.9K关注 0票数 1

如何以角的形式强制执行只读属性?

主计长:

代码语言:javascript
复制
function MyCtrl($scope) {
  $scope.clickCount = 0;
  $scope.incrementCount = function() {
    $scope.clickCount = $scope.clickCount + 1;
  }
}

查看:

代码语言:javascript
复制
<div ng-controller="MyCtrl">
  Clicked {{clickCount}} times
  <button ng-click="incrementCount()">Doober</button>
  <input type="text" ng-model="clickCount" /><!-- how do I prevent this -->
</div>

我知道我可以使clickCount成为一个getter函数getClickCount(),但是这会不会降低性能,因为角将不得不在每个消化周期调用这个函数吗?

http://jsfiddle.net/zb05om1k/

更新

我正在寻找一种方法,清楚地表明,只读属性不应直接更改,而应通过提供的函数进行更改。此外,防止视图直接更改属性。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-09 22:52:41

在您的示例中,incrementCount()被调用一次,执行所需的时间可以忽略不计,然后角开始一个摘要周期,然后DOM重新构建,这无论如何都会发生。

一般情况下,您不需要优化时间受用户输入限制的代码。在我看来,您的示例代码很好。

如果您确实希望通过使属性只读来强制关注点分离,则可以使用Object.defineProperty来防止写入:

代码语言:javascript
复制
var myApp = angular.module('myApp',[]);

myApp.controller('MyCtrl', function MyCtrl($scope) {
    var clickCount = 0; // Private variable

    Object.defineProperty($scope, 'clickCount', {
        set: function() { // Prevent views from editing data
            throw new Error('Operation not supported');
        },
        get: function() {
            return clickCount;
        }
    });

    $scope.incrementCount = function() {
        clickCount++;
    }
});

当您将数据放入输入时,控制器会抛出一个错误,并且更改将立即在DOM中删除。

小提琴:http://jsfiddle.net/acbabis/5bq5oeq3/

票数 1
EN

Stack Overflow用户

发布于 2015-04-20 17:51:29

使用角指令ng-readonly,它的工作就像它的声音.

https://docs.angularjs.org/api/ng/directive/ngReadonly

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29754636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档