2013-04-24 178 views
1

我写了自己的指令,通过ajax解析带有select2和gat数据的输入。AngularJS ngModel指令

HTML:

<input type="text" 
     ng-model="name" 
     data-ui-event="{keyup: 'searchByName($event)',change: 'searchByName($event)'}" 
     ajax-select2="single" data-url="/ajax/name/" 
/> 

JS:

.directive('ajaxSelect2', ['$timeout', function ($timeout) { 
return { 
    restrict: 'A', 
    link: function (scope, element, attrs) { 
     var reqParams = {}, 
      multiple = attrs.ajaxSelect2 === "multi" || 
         attrs.ajaxSelect2 === "multiple" ? true : false; 

     switch(element.prop("tagName")) { 
      case 'INPUT': 
       element.select2({ 
        multiple: multiple, 
        ajax: { 
         quietMillis: 200, 
         url: attrs.url, 
         dataType: 'json', 
         type: 'POST', 
         data: function (term, page) { 
          var req = { 
           "val": term, 
          }; 
          return JSON.stringify(req); 
         }, 
         results: function (data, page) { 
          return { results: data }; 
         } 
        } 
       }); 
      break; 

      default: 
       alert('ajax-select2 works only with input fields!'); 
      break; 
     } 

     element.bind("change", function() { 
      element.show(); //shows the input 
      $timeout(function() { 
       element.trigger('keyup'); //doesn't work 
      }); 
     }); 
    } 
}}]) 

我的问题:所选择的值设置为输入和searchByName函数被调用,但它并没有与我的NG-模型工作。如果我用ng-model =“name”添加另一个输入,则该值也应写入此输入。但事实并非如此。

编辑:这是一个jsFiddle

+0

你在哪里使用ng-bind?或者你的意思是ng模型?如果ng-model在你的select2回调函数中的某处,你需要手动更新'scope.name',或者你的searchByName函数已经做到了吗? – 2013-04-24 15:33:49

+0

一把小提琴或一把撬棍将帮助我们找到解决方案。 – Galdo 2013-04-25 02:07:10

+1

哦,该死!是的,ng-model不是ng-bind。我只有两分钟时间写这个。我现在准备一把小提琴。 – StinsonMaster 2013-04-25 06:45:42

回答

1

明白了!
我不得不手动更新范围内的ng模型。

element.bind("change", function(e) { 
    scope.$apply(function() { 
     scope[attrs.ngModel] = e.val; 
    }); 
}); 

完整的代码示例here

+0

这段代码在绑定变量中不起作用,请参阅:http://stackoverflow.com/questions/16494457/how-to-set-an-interpolated-value-in-angluar-directive – asktomsk 2013-08-28 17:44:45

-2

正确的代码:

$timeout(function() { 
    element.trigger('keyup'); //doesn't work 
}, **Interval**); 
+0

这不起作用。 – StinsonMaster 2013-05-07 11:22:24