1

我正在向现有的 Microsoft MVC 3 应用程序添加一些功能。当我确实需要向页面添加一些新功能时,我无法更改应用程序本身的现有结构。我在 div 中有角度运行(通过 jquery 对话框加载时隐藏)。MVC 应用程序在页面上有几个选项卡。每次选择选项卡时,都会加载部分 cshtml(剃刀)。除了那个部分,我的角度模板也包括在内。部分引用了一个包含角度控制器的 js 文件。当它第一次加载并且用户打开选项卡并打开包含角度的 jquery 对话框时,一切正常。保存更改后,我开始注意到一些有趣的行为。如果我关闭包含角度模板的对话框,切换到另一个选项卡,我注意到同样的不规则行为,然后切换回包含角度模板的选项卡。这是正在发生的事情:

  • MVC 加载的部分重新加载了 angular 模板,该模板在引用的 js 文件中启动 angularjs 控制器方法
  • 每次发生这种情况时都会生成一个新的 $scope。
  • 每次调用控制器方法时(通过绑定到模板上的按钮的 ng-click 事件),该方法将执行 n 次,其中 n 是自上次完整页面刷新以来部分加载的次数。

我通过在控制器方法开始时将 $scope 对象记录到窗口来证明了这种方法

window['scope_' + new Date().getTime().toString()] = $scope;

每次部分页面加载后,都会在窗口中记录一个新的 $scope 对象。按下模板上的按钮会调用与 ng-click 事件相关的特定方法。此事件会触发多次。但是使用窗口中最旧的记录范围对象在控制台中手动调用该方法

scope_1378413848781.$apply(scope_1378413848781.getSomeData())

它按预期工作。 所以,我的问题是,如何防止控制器在每次 MVC 框架重新加载部分时添加新范围?

以下是我尝试过的一些不起作用的事情:

  • 添加全局标志并退出控制器方法(如果已设置)
  • 将控制器引用移动到 _layout.cshtml 文件
  • 关闭包含模板的对话框时破坏范围

最后一点,我没有使用我知道的角度路由提供程序,当与 .

4

1 回答 1

2

看来 Angularjs 并不打算以这种方式使用。根据角度文档

您可以使用 Angular 来开发单页和往返应用程序,但 Angular 主要是为开发单页应用程序而设计的……您通常不希望在每次页面更改时都加载 Angular,就像使用在往返应用程序中使用 Angular。

为了解决这个问题,我将 angular 模板以及对控制器和 angular.min.js 的引用移到了共享的 _Layout.cshtml 文件中。此部分文件首先加载,并且仅在刷新整个页面时重新加载。在 asp.net mvc 3 partials 中引用的 js 文件中添加角度引用和加载控制器将导致难以检测的范围复制。

于 2013-09-09T19:03:12.337 回答