Angular 指令:选择更改时 ng-model 未正确更新

Angular directive: ng-model not updated properly when selection changes

我有以下指令:

app.directive('skiTest', function($timeout,$compile) {
return {
  'replace': true,
  'restrict': 'E',
  'scope': {
    'data': '=',
    'selecto': '@',
      'ngModel': '='
  }, 
  link: function (scope, element, attrs) {
      attrs.$observe("selecto", function () {
          $timeout(function () {  // we need a timeout to compile after the dust has settled
              $compile(element.contents())(scope); //recompile the HTML, make the updated content work.
          },0);
      });
   },
    'template':'<div><select name="testSelect" ng-model="ngModel" ng-options="{{selecto}} in data"><option value="">Code</option></select></div>'
}

});

http://jsfiddle.net/L269zgbd/1/

如果我将尝试 select 指令中的一个国家 selection box,ng-model 对象将被设置为 null。

知道这是为什么吗?我该如何解决这个问题?

基本上我希望在指令 selection 上的行为与我在非指令 selection 上获得的行为相同。

谢谢!

如果升级 fiddle 中使用的 angular 版本,则无需使用 $compile$timeout

app.directive('skiTest', function () {
    return {
        'replace': true,
            'restrict': 'E',
            'scope': {
            'data': '=',
                'selecto': '@',
                'ngModel': '='
        },
        'template': '<div><select name="testSelect" ng-model="ngModel" ng-options="{{selecto}} in data"><option value="">Code</option></select></div>'
    }
});

DEMO

如果您无法像 charlietfl 建议的那样升级您的 angular 版本,您可以改用 $compile 函数:

app.directive('skiTest', function($timeout,$compile) {
    return {
        'replace': true,
        'restrict': 'E',
        'scope': {
            'data': '=',
            'selecto': '@',
            'ngModel': '='
        }, 
        'template':'<div><select name="testSelect" ng-model="ngModel" ng-options="{{selecto}} in data" ng-change="changed()"><option value="">Code</option></select></div>',   
        compile: function(tElement, tAttributes){
            tElement[0].innerHTML = tElement[0].innerHTML.replace('{{selecto}}', tAttributes.selecto);
        }
    }});

jsfiddle: http://jsfiddle.net/r366r3b7/