angular.extend $ scope上的getter和setter

时间:2016-01-27 22:39:56

标签: javascript angularjs angularjs-scope

我正在阅读一篇有趣的文章AngularJS: Tricks with angular.extend(),并解释了如何将getterssettersextend一起使用。但有些观点我不明白。

JS:

app.controller('ThingController', [ '$scope', function($scope) {

    // private
    var _thingOne = 'one',
        _thingTwo = 'two';

    // models
    angular.extend($scope, {
        get thingOne() {
            console.log("get thing1");
            return _thingOne + 'eeeeee';
        },
        set thingOne(value) {
            console.log("set thing 1");
            if (value !== 'one' && value !== 'two'){
                throw new Error('Invalid value ('+value+') for thingOne');
           }
        },
        get thingTwo() {
            console.log("get thing2");
            return _thingTwo + 'oooooo';
        },
        set thingTwo(value) {
            console.log("set thing 2");
            if (value !== 'two' && value !== 'three'){
                throw new Error('Invalid value ('+value+') for thingTwo');
           }
        }
   });

    // methods
    angular.extend($scope, {
       get things() {
            return _thingOne + ' ' + _thingTwo;
        }
    });

}]);

HTML

<body ng-controller="ThingController">
    {{ things }} // one, two 
</body>

我的问题:

  1. ¿为什么get thingOne()未归还oneeeeeee? (get thingTwo()

  2. 相同
  3. ¿在哪里称为set thingOneset thingTwo?因为我从未在控制台set thing 1set thing 2上看到。

  4. ¿如何在set method内声明angular.extend methods? ¿可以从视图中确定一个值吗?

2 个答案:

答案 0 :(得分:2)

尝试这种方式:

angular.extend($scope, {
    get things() {
        return $scope.thingOne + ' ' + $scope.thingTwo;
    }
});

在这种情况下将调用Setter:

$scope.thingOne = 'test';

答案 1 :(得分:1)

它与angular.extend无关 - 这些是属性访问器:getter和setter ...允许你在对象字段的读/写中添加一些逻辑。

以下是您如何定义一个:

var instance = {
   get prop() { return this._prop },
   set prop(value) { this._prop = value }
}

像这样使用它:

instance.prop = "new value"
var x = instance.prop

angular.extend仅将此定义复制到$ scope。您也可以使用Object.define ..如下所示: http://jsfiddle.net/v1bxyrx1/2/