【问题标题】:Binding not updating, ocModal绑定不更新,ocModal
【发布时间】:2014-06-13 18:17:38
【问题描述】:

我正在使用 ocModal 指令 + 服务 (https://github.com/ocombe/ocModal)。当有人想要删除一条记录时,他们点击删除按钮,该按钮通过 ocModal 弹出一个确认模式。

oc-modal-close ng-click="deleteNote(id)"

到目前为止一切顺利。在控制器中 deleteNote 运行。 Console.log 显示参数是我传递的 id。我调用一个 API 从我的数据库中删除笔记,并在成功调用一个函数从 Angular 变量 $scope.notes 中删除笔记。

  $scope.removeNote = function(id){
    console.log(id);
    console.log($scope.notes);
    delete $scope.notes[id];
    console.log($scope.notes);
  };

id 正确,删除命令后的 $scope.notes 显示它已正确删除。然而,我的前端没有相应的更新。根据我在 Stackover 上看到的建议,我使用了 apply(),这导致了“已在进行中的摘要循环”错误。然后我尝试使用 $timeout ,但是虽然它消除了摘要循环错误,但它并没有解决绑定问题。

ng-repeat 使用 $scope.notes 是否相关,然后使用指令?我做了一些实验,不这么认为,但以防万一想提一下。

【问题讨论】:

  • 我建议你制作一个复制最少的 Plunker 或 JSFiddle

标签: angularjs binding


【解决方案1】:

你从哪里调用 $scope.removeNote?它来自您的主控制器还是模态控制器?也许是一个指令? 感觉好像打错了范围。您可以尝试将注释移动到 $scope.model.notes 并查看它是否有帮助,因为它将确保引用正确的范围,但除非您尝试提供一个小提琴,否则很难说发生的问题。 我创建了这个简单的小提琴,试图用 $timeout 模拟 API 调用,它可以工作 -> http://jsfiddle.net/7eqsc/1/

angular.module('myApp',[])
.controller('myCtrl',function($scope,$timeout){
$scope.notes={
    a:'AngularJS',
    b:'Rocks'
}

$scope.addRandom=function(){
    $scope.notes[parseInt(Math.random()*10000).toString(36)]='New Item';
}

$scope.removeNote=function(id){
    //emulate API call
    $timeout(function(){
    delete $scope.notes[id];
    },2000);
}

});

一般来说,我建议将东西放在一个对象下,例如“.model.yourArray”,它可以确保正确保存引用并为您省去很多麻烦。

【讨论】:

  • $scope.removeNote 是从模态中调用的,是的,但是模态的控制器已设置为“showRecordingCtrl”,即 a) 设置了所有相关的 $scope 变量,b) 其中remoteNote 是。我认为问题可能是 ocModal 设置(oc-modal-open="{url: 'partials/confirm_delete_note.html', init: {id: noteId}, cls: 'deleteNote', controller: 'showRecordingCtrl'}")建立相关的控制器,但不建立关联的绑定。现在浏览代码并尝试创建一个简单的 plunkr 示例。
  • 作为旁注,我写了一个简单的指令,这样我可以在每次需要确认模式时添加到我的按钮中。我在这里基于这个问题:stackoverflow.com/questions/18313576/… 并将其与 AngularUI 的模态结合起来,现在每次我有一个“有风险”的动作时,我都会将最后的动作放在 ng-click 中,然后将 ng-click-confirm 添加到按钮,然后它将所有内容都包装在一个确认模式中,就像一个魅力。这里有脏代码 -> pastebin.com/Be7zeB3T
  • 我对 ocModal 的研究越多,对于简单确认而言,它似乎就越复杂。它对表单等很有用,但我非常喜欢您引用的代码背后的想法。可能只是切换到那个。谢谢!
  • 确实如此 :) 祝你好运!
  • 由于我自己对 ocModal 的误解,问题最终成为范围之一,以防其他人遇到此问题。 $init 实现而不是简单地指定控制器(它创建控制器的新实例而不是使用已经创建的控制器的范围)导致了解决方案,但我认为 GabrielG 的代码是一个更好的整体实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 2016-12-08
相关资源
最近更新 更多