为什么在这种特殊情况下视图没有更新? ($范围。$适用)

时间:2014-10-23 12:07:35

标签: javascript angularjs

试着理解为什么在这种情况下我需要使用$ scope。$ apply?根据我所读到的关于这个主题的所有信息,我不应该这样做,因为一切都发生在Angular内部?我错过了什么?

在我的控制器中:

$scope.savePreset = function(columns, $event){
  $event.preventDefault();
  preset.name = prompt("Please enter preset name", "My Preset");
  if (preset.name != null) {
    preset.columns = $scope.columns;
    $scope.presets[preset.name] = preset; // (Object)
    // Without $scope.$apply() here, view isn't updated. Why?
    alert('Your preset "' + preset.name + '" has been saved.');
    $scope.loadPreset(preset.name);
  } else {
    alert('Please enter a valid name.');
  }
}

({-1}}函数在ng-click指令中调用,并且savePreset有一个ng-repeat,它不会更新。

谢谢, 皮姆

2 个答案:

答案 0 :(得分:3)

如评论@Sergiu Paraschiv所述,使用包含在window中的函数停止了角度$digest周期,这就是为什么我的建议是使用$window提供者和$window.prompt和$ window.alert函数我认为它们会起作用

here is a example

答案 1 :(得分:1)

〜提示,提醒..将暂停执行代码(阻塞线程),防止像setInterval,setTimeout这样疯狂。

$ digest循环由两个较小的循环组成:  当你做一个提示。使用$ evalAsync,里面的代码在angular之外执行。这通常用setTimeout(0)完成。

所以在一句话中:这是提示的错,你可能会更好地使用一个做同样事情的小部件。

编辑: 抱歉提交给快:这是原始答案: Error: $digest already in progress in angularjs when using alert