在 angularjs 中调整非标准属性

Adapting non-standard properties in angularjs

我有一个使用 GWT 2.7 从 java 编译为 java 脚本的现有模型。此模型中的每个 属性 都有一个 getValue() 和一个 setValue() 方法。方法名称未损坏。

我想在 {{}} 表达式中使用这些属性,专门用于使用 ngModel 进行绑定。我在 $scope 中使用 "getterSetter" 选项和一个函数,该函数将 getValue()/setValue() 包装在 angularJS getterSetter 函数中。

问题是我不想在每个范围内重复这个函数。有什么方法可以访问 angularJS 表达式中的全局函数?

来自文档:

Angular expressions do not have access to global variables like window, document or location. This restriction is intentional. It prevents accidental access to the global state – a common source of subtle bugs.

你能把函数附加到模型原型上吗?这样你就可以在任何有模型实例的地方访问它。

或者,您可以创建一个包装器 class(基本上是一个视图模型),它具有您需要的接口,并委托给真实的模型实例。

经过相当多的搜索和试验,我发现我可以使用 directivecontroller 将函数添加到 scope

.directive('wrapped', function() {
    return {
        controller: function($scope) {
            $scope.wrapper = function(prop) {
                // turns signal into getterSetter
                return function(newVal) {
                    if (angular.isDefined(newVal)) {
                        prop.setValue(newVal);
                        }
                    return prop.getValue();
                    }
                }
            },
        scope : {
            model : '&'
            },
        templateUrl : 'template.html',
    }
})

然后可以在模板中的表达式中使用作用域中的函数。

<p class="field {{model().status().isValid() ? 'valid' : 'invalid'}}">
    <span class="label">{{label}}:</span>
    <input type="text" ng-model="wrap(model())" ng-model-options="{getterSetter: true}" ></input>
</p>

如果有更惯用的写法,我很乐意听取更有经验的 AngularJS 程序员的意见。