2016-03-04 41 views
4

我有下面的代码片段:动态设置ngModelOptions在角

<input type="date" ng-model="arrival" ng-model-options="{timezone: 'PST'}" /> 
<input type="time" ng-model="arrival" ng-model-options="{timezone: 'PST'}" /> 
{{arrival}} 

可以正常工作(日期显示,从PST转换UTC时间)。现在我努力使“PST”选项动态:

<select ng-model="timezone> 
    <option value="PST">PST</option> 
    <option value="EST">EST</option> 
</select> 
<input type="date" ng-model="arrival" ng-model-options="{timezone: timezone}" /> 
<input type="time" ng-model="arrival" ng-model-options="{timezone: timezone}" /> 
{{arrival}} 

但是,更改时区从不更新的到来(似乎绑定不nd-model-options工作)。任何方式我可以强制时区更改时刷新字段?

编辑

小提琴:https://jsfiddle.net/10nfqow9/

+0

尝试具有以ng-模型选项的对象,是这样的: 'NG-模型选项= “选项”' 和 '$ scope.options = {timezone:$ scope.timezone}' –

+0

@NMittal没有什么区别。 –

回答

1

具有高优先级创建另一个指令(属性类型)(高于NG-模型/ NG-模式选项的),其手表的选择对象的变化和触发重新编译。我很抱歉缺乏具体细节,我在打电话:)

编辑: 看起来像有一个指令kcd-recompile,正是我所描述的。这里有一个工作plnkr,在美国时区用于考虑夏令时的一些额外好处。

HTML:

<div kcd-recompile="data.timezone"> 
    <div> 
    <select ng-model="data.timezone" ng-options="x.offset as x.name for x in timezones"> 
    </select> 
    </div> 
    <div> 
    <input type="date" ng-model="data.arrival" ng-model-options="{timezone: data.timezone}" /> 
    </div> 
    <div> 
    <input type="time" ng-model="data.arrival" ng-model-options="{timezone: data.timezone}" /> 
    </div> 
</div> 

和JS:

Date.prototype.stdTimezoneOffset = function() { 
    var jan = new Date(this.getFullYear(), 0, 1); 
    var jul = new Date(this.getFullYear(), 6, 1); 
    return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); 
} 

Date.prototype.dst = function() { 
    return this.getTimezoneOffset() < this.stdTimezoneOffset(); 
} 

angular.module('DemoApp', ['kcd.directives']); 
angular.module('DemoApp') 
.controller('DemoCtrl', ['$scope', function($scope) { 
    var now = new Date(), 
     isDst = now.dst(); 

    $scope.data ={ 
     arrival: now, 
     timezone: null 
    }; 
    $scope.timezones = [ 
     { 
     name: 'PST', 
     offset: isDst ? '-0700' : '-0800' 
     }, 
     { 
     name: 'EST', 
     offset: isDst ? '-0400' : '-0500' 
     } 
    ]; 
    }] 
);