Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么将ng select替换为自定义指令会导致$http请求不会每隔一次发送一次_Javascript_Ajax_Angularjs - Fatal编程技术网

Javascript 为什么将ng select替换为自定义指令会导致$http请求不会每隔一次发送一次

Javascript 为什么将ng select替换为自定义指令会导致$http请求不会每隔一次发送一次,javascript,ajax,angularjs,Javascript,Ajax,Angularjs,编辑我现在已经通过在指令模板中使用ng click修复了这个错误,但是我仍然有兴趣知道ng click与元素有什么不同。bind以及为什么它很重要 我确实有一个ng选择框来更新我的模型 --速率性能-- 在漫长的验证过程结束时,它创建了一个新的$http请求(通过$resource.$update)并保存了记录 我现在改为使用自定义指令 它附加了下面的侦听器(实际的侦听器稍微复杂一些,但我已经非常严格地检查了它是否总是按预期触发tune.resource.$update) 现在,奇数单击

编辑我现在已经通过在指令模板中使用
ng click
修复了这个错误,但是我仍然有兴趣知道
ng click
元素有什么不同。bind
以及为什么它很重要

我确实有一个ng选择框来更新我的模型


--速率性能--

在漫长的验证过程结束时,它创建了一个新的
$http
请求(通过
$resource.$update
)并保存了记录

我现在改为使用自定义指令


它附加了下面的侦听器(实际的侦听器稍微复杂一些,但我已经非常严格地检查了它是否总是按预期触发
tune.resource.$update

现在,奇数单击创建
$http
对象但不发送,偶数单击发送先前创建的
$http
对象并创建并成功发送一个新对象。即使单击指令的不同实例,这种情况也会持续发生。我试过在范围上使用
$digest
$apply
,但它们没有任何影响(我不确定它们是否应该,因为
$http
在我看来,它应该独立于摘要周期运行)

有人能想到问题出在哪里吗

完整指令代码 模板呢
{{rating.value}
更改:

element.bind('click', function (ev) {
  tune.resource.$update();
});
致:

我们应该做到这一点。
bind('click')
ng click
之间的区别在于
ng click
触发角度
$digest
循环,而
bind('click')
不会。
任何
$http
$resource
请求仅在角度
$digest
循环(内部角度事件循环)内调用时触发对服务器的请求。因此,在您的案例中,您调用了
resource.update
,但超出了angular
$digest
周期,所以在下次触发angular事件循环(例如,执行ng更改)并启动对服务器的请求之前,不会向服务器发出请求,而只是“安排”了请求

不完全清楚问题是什么,但重要的是要知道,如果您在外部(非角度)代码中更改范围对象(如单击处理程序),那么您可以使用
$apply
更改范围,因此角度知道修改非常好的解释。增加了我对无止境的理解
directives.directive('jPerformanceRater', function () {
    return {
    // transclude: true,
        scope: true,
        templateUrl: '/views/directives/performance-rater.html',
        compile: function(element, attrs) {
            return function (scope, element, attrs) {
                var tune = scope[attrs.tune || 'tune'];

                scope.tune = tune.tune;
                element.bind('click', function (ev) {
                    ev.cancelBubble = true;
                    var btn = ev.target.className.indexOf('icon') > -1 ? ev.target.parentNode : ev.target;

                    if (btn.className.indexOf('btn')  === -1) {
                        return;
                    }
                    tune.dummyStandard = +btn.textContent;
                    tune.update(); // most of the validation happens in here and then it calls resource.$update()

                });
                element.addClass('performance-rater');
            };
        }
    };
});
<span class="btn btn-small" ng-repeat="rating in dropdowns.playback" type="checkbox"
   title="{{rating.label}}">{{rating.value}}<i class="icon icon-star{{rating.value == 0 ? '-empty' : ''}}"></i></span>
element.bind('click', function (ev) {
  tune.resource.$update();
});
element.bind('click', function (ev) {
  scope.$apply(function(){
     tune.resource.$update();
  });
});