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

时间:2015-03-06 16:22:06

标签: javascript angularjs angularjs-directive

我有以下指令:

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/

如果我尝试在指令选择框中选择国家/地区,则ng-model对象将设置为null。

知道为什么会这样,我该如何解决这个问题?

基本上我希望指令选择的行为与非指令选择的行为相同。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果升级小提琴中使用的角度版本,则不使用$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

答案 1 :(得分:0)

如果你不能像charlietfl一样升级你的角度版本,你可以使用$ 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/