【问题标题】:modalService cannot talk with controller and viewmodalService 无法与控制器和视图对话
【发布时间】:2016-04-05 21:11:08
【问题描述】:

The code at this plnkr 有一个模态框,当用户单击 “点击参加测验” 按钮时会弹出一个模态框,该按钮调用一个控制器方法,该控制器方法又调用一个模态服务。 要让 plnkr 工作,请单击代码中的任意位置并按空格键以不影响语法的方式添加空格。这将触发 plnkr 重新初始化应用程序并在您单击按钮后弹出模式。

问题是当timeLeft变量倒计时时,模态中打印的文本不会动态更新。而且,用户的按钮单击不会更新quizAnswer 变量。简而言之,模态框无法与调用控制器和视图进行交互对话。

需要对plnkr进行哪些具体的修改才能获取模态文本显示动态倒计时,以及获取模态按钮来改变$scope.quizAnswer变量的值?

另外,我一直在仔细阅读the documentation at this link。我认为答案可能与:

1.) 在open(options) 中传递的$uibModaloptions 参数包含参数scope,该参数定义了用于模态内容的父范围,以及属性bindToController,当设置为true,将scope 属性绑定到controllerAs 定义的特定控制器。

2.) open(options) 方法返回一个模态实例,其中包括close(result)dismiss(reason)

我怀疑解决方案在于这些方法和参数,但我正在寻找好的例子,希望有经验的人来看看这个问题。

注意:此问题的解决方案出现在已接受答案下方的 cmets 中,尤其是指向另一个帖子的链接,其中包含 2 行代码,用于将模式按钮单击的结果发送回父控制器。

【问题讨论】:

  • 我不认为这会是罪魁祸首,但很快你就会看到$scope.$digst();,这是一个错字。话虽如此,您不需要在 $interval 中调用摘要
  • @dman2306 谢谢。此外,简单地修复错字会导致 plnkr 重新初始化,从而使模态再次工作。由于某种原因,模态按钮在一段时间后不会产生模态,除非您通过键入一两个字符来触发应用程序的重新初始化。还有其他建议吗?
  • 发布大量与问题无关的代码并且不能正常工作不是好的做法。
  • @PetrAveryanov 根据上面的评论,plnkr 在您触发重启时起作用,例如将digst() 更改为digest()。此外,如果您认为发布的代码的某些方面不相关,请提出具体的编辑建议,我会很乐意审查它们以改进 OP。我刚刚在 OP 末尾添加了一些内容,显示了一个文档链接,其中包含我发现的可能相关内容的摘要。
  • @PetrAveryanov 我还在 OP 顶部添加了一个粗体注释,解释了如何通过创建空格来启动模式弹出窗口。我认为这与 modalexists 变量在应用程序重新初始化时重新设置为 false 有关。

标签: javascript angularjs angular-ui-bootstrap angular-ui angular-bootstrap


【解决方案1】:

你有很多问题。

首先,takeQuiz 在 navigation.js - 第 16 行,应该附加到 $scope,而不是 this,因为 this 会根据上下文发生变化。

第二,navigation.js 中的$scope.$apply$scope.$digst(); - 第 29/30 行是不必要的,因为您已经处于摘要循环中。应该删除它们,否则它们会触发错误。

最后(这是您问题的核心),您误解了在创建模态实例时如何绑定模态选项。它不是双向绑定;它是从一个对象延伸到另一个对象的单一对象。因此,尝试绑定到选项(或使用 timeRemaining 创建连接字符串)将不会在绑定后更新。

相反,一种可能性是在模态框内创建一个事件处理程序,并在每次滴答时广播,更新模态框。此外,如果您将正文文本作为前置和附加文本传递,则更容易插入您的时间戳值:

您需要在您的 navigationController 中注入(并从中广播)$rootScope,因为 modalService 注册在作用域链中非常高的位置。

在每个刻度上,广播剩余时间 navigation.js:

$rootScope.$broadcast('timeRemainingTick', $scope.timeRemaining);

在您的 modalService.js 中,注册以接收控制器分配内的事件:

var timeRemainingUnbind = $scope.$on('timeRemainingTick', function(event, newTick) {
    $scope.modalOptions.timeRemaining = newTick;
});

最后,确保通过在模式的关闭事件中调用 timeRemainingUnbind() 来取消绑定事件以防止内存泄漏:

$scope.modalOptions.ok = function (result) {
    timeRemainingUnbind();
    $modalInstance.close(result);
};

$scope.modalOptions.close = function (result) {
    timeRemainingUnbind();
    $modalInstance.dismiss('cancel');
};

查看我的工作分叉 plunker here

【讨论】:

  • 感谢您和 +1 抽出宝贵时间来教育我们。如何在浏览器页面上获得用户选择打印的结果?用户选择蓝色或灰色,则蓝色或灰色一词应成为打印在页面上的quizAnswer 变量。除了让用户阅读它之外,这还将允许从导航控制器进行编程访问。加上完成这个 OP 的解决方案?
  • @CodeMed 不客气。那将是一个单独的问题,而不是同一问题的延伸。如果您坚持使用当前的模态方法,您可能希望将其发射回导航服务。
  • 不用担心。 OP 确实将问题陈述为 需要对 plnkr 进行哪些具体更改以获取模态文本以显示动态倒计时,并获取模态按钮以更改 $scope.quizAnswer 变量的值?。然而,这不是你的责任,我很感激你为实现这一目标所做的一切。再次感谢您。
  • @CodeMed 我明白 :)。我的观点是,这个特定问题中已经有太多的内容,以至于它正在降低其他人将其用作参考的价值。进一步扩展它以包含额外的范围将使它变得不那么有用,而专门创建一个新问题以使用(现在)工作代码解决该问题对未来的其他人更有益。
  • 无论如何,我已经仔细阅读了您的答案,并且我已经仔细比较了您的 plnkr 中的代码与我的 plnkr 中的代码,通过检查您的 plnkr 对您的答案指定的所有更改进行了验证.但是生成的新 plnkr 不会更新模态中的计时器。我将继续研究这两个 plnkrs,但你愿意看看我的新尝试来实现你的答案吗?这是链接:plnkr.co/edit/6FHlHIvMEg4CoxDkxs2w?p=preview
猜你喜欢
  • 1970-01-01
  • 2014-12-09
  • 2021-10-26
  • 2014-06-11
  • 1970-01-01
  • 2015-07-16
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多