2013-04-09 5 views
11

私はAngular JSでカスタムディレクティブを作成しています。テンプレートをレンダリングする前にng-modelをフォーマットしたいと思います。AngularJS - カスタムディレクティブでテンプレートがレンダリングされる前にng-modelをフォーマットする

これは私がこれまで持っているものです。私はそれはのngModelに入る前にunformattedDate値をフォーマットしたい

app.js

app.directive('editInPlace', function() { 
    return { 
     require: 'ngModel', 
     restrict: 'E', 
     scope: { ngModel: '=' }, 
     template: '<input type="text" ng-model="ngModel" my-date-picker disabled>' 
    }; 
}); 

HTML

<edit-in-place ng-model="unformattedDate"></edit-in-place> 

テンプレート。このようなもの:

template: '<input type="text" ng-model="formatDate(ngModel)" my-date-picker disabled>' 

しかし、それは私にエラーを与えます。これを行う方法?

答えて

25

ngModelはコントローラngModelController APIを公開しています。

ディレクティブでは、あなたが必要とする通りに$formattersを追加し、逆に(モデルに行く前に値を解析する)$parsersを追加することができます。

これは、あなたが行くべきかです:あなたは$フィルターを手に入れた

app.directive('editInPlace', function($filter) { 
    var dateFilter = $filter('dateFormat'); 

    return { 
    require: 'ngModel', 
    restrict: 'E', 
    scope: { ngModel: '=' }, 
    link: function(scope, element, attr, ngModelController) { 
     ngModelController.$formatters.unshift(function(valueFromModel) { 
     // what you return here will be passed to the text field 
     return dateFilter(valueFromModel); 
     }); 

     ngModelController.$parsers.push(function(valueFromInput) { 
     // put the inverse logic, to transform formatted data into model data 
     // what you return here, will be stored in the $scope 
     return ...; 
     }); 
    }, 
    template: '<input type="text" ng-model="ngModel" my-date-picker disabled>' 
    }; 
}); 
+0

?それを関数に渡す必要がありますか?私は日付をフォーマットするためにグローバルスコープ内のフォーマッタを使用しています。私の現在のパラメータは$ rootScope – Lulu

+0

です。また、valueFromModel変数は未定義を返します。私は何か間違っている? – Lulu

+0

'$ filter'は、あなたが使っていると思ったので、注入されています。そうでなければ、 '$ rootScope'を注入してフィルターに到達してください。 'valueFromModel'については、開始時に値が' null'である可能性があるので、 'null'か ''を返します。 –

関連する問題