2014-07-01 43 views
0

Angular v1.2.17angularjs不消化的範圍?

我正在使用過濾器創建輸出格式化指令。 我在另一個使用該指令。

我的問題是,當父指令中的值發生更改時,指令不會更新DOM。

我使用scope.$watch訂閱的value變量。

app.directive('mdmFormattedOut', ['$filter', 'appSettingsService', function($filter, appSettingsService){ 
return{ 
    restrict: 'A', 
    replace: true, 
    template:'<span ng-bind="valueToDisplay"></span>', 
    scope:{ 
     value: '=', 
     datatype: '=' 
    }, 
    link: function(scope){ 
     scope.$watch('value', format()); 
     function format(){ 
      switch(scope.datatype){ 
       case 'date': 
        scope.valueToDisplay = $filter('date')(scope.value, appSettingsService.dateFormat); 
        break; 
       case 'currency': 
        scope.valueToDisplay = $filter('currency')(scope.value, appSettingsService.currency); 
        break; 
       default: 
        scope.valueToDisplay = scope.value; 
        break; 
      } 
     } 
    } 
}; 

}]);

如果我ng-bind="value"取代ng-bind="valueToDisplay"那麼一切都很好。

有什麼問題?爲什麼手動訂閱不起作用?

+0

你是怎麼創造這個的? '

'? –

回答

2

$watch()函數需要一個回調函數作爲第二個參數。
您的代碼應該是這樣的:

scope.$watch('value', format); 

不是傳遞一個回調的時間,您通過調用format()這是undefined的回報。

+0

的確如此,這當然不是他的意圖。但它不應該成爲不工作的原因,因爲該功能仍在觸發並改變其值。看到這個plunker http://plnkr.co/edit/YYh0utqsFWfGQKrOj4Ay?p=preview – zszep

+1

該函數執行一次(因爲你明確地調用它) - 這並不意味着$ watch的作品和更新數據時,最後的變化發生。 – gkalpak

+0

你有一個點 – zszep

1

首先,從我的理解,你不需要雙向綁定你的範圍。

scope:{ 
     value: '@', 
     datatype: '@' 
    }, 

其次,你的模板或許應該是這樣的:

<span>{{valueToDisplay}}</span> 
+0

這並沒有解決問題,但你仍然有一個問題。不需要雙向綁定! – razvanz