2015-01-15 103 views
0

我有一個使用GWT 2.7從java編譯爲javascript的現有模型。該模型中的每個屬性都有一個getValue()和一個setValue()方法。方法名稱不會被損壞。在angularjs中修改非標準屬性

我想在{{}}表達式中使用這些屬性,特別是使用ngModel進行綁定。我使用「getterSetter」選項和$ scope中的一個函數,該函數將getValue()/ setValue()封裝在angularJS getterSetter函數中。

問題是我不想在每個範圍內複製這個函數。有沒有什麼方式在angularJS表達式中訪問全局函數?

回答

0

經過相當多的搜索和試驗後,我發現我可以使用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程序員,如果有更習慣的方式來寫這個。

0

從文檔:

角度表述沒有獲得像窗口,文檔或位置的全局變量。這個限制是有意的。它可以防止意外進入全球國家 - 這是微妙的錯誤的常見來源。

您可以將該功能附加到模型原型嗎?這樣,只要有模型實例,就可以訪問它。

或者,您可以創建一個包裝類(基本上是一個視圖模型),它具有您需要的接口,並委託給實際模型實例。

+0

附加功能的原型作品,但它不是我正在尋找。每個可觀察屬性都有一個單獨的對象,並且其中許多對象具有唯一類,例如用於計算屬性。我可以將它添加到Object.prototype中,但這非常殘酷。 –

+0

添加包裝正是我想要在該功能中執行的操作。如果我提前包裝每個屬性對象,我還需要重新創建結構。 –