【问题标题】:How do I reinitialise $scope variables in a view's controller on reload in Angular?如何在 Angular 中重新加载视图控制器中的 $scope 变量?
【发布时间】:2014-10-02 14:44:41
【问题描述】:

我有一个简单的 Angular webapp,但当我重新访问路线时遇到问题。在第一次访问时,路由的控制器使一切正常运行。在第二次访问时,事情破裂了。控制器设置视图中画布元素的尺寸。一个精简的控制器示例:

// app.js
var app = angular.module('noahdecocoApp', ['ngAnimate', 'ngCookies', 'ngResource', 'ngRoute', 'ngSanitize', 'ngTouch']);

app.config(function ($routeProvider) {
  $routeProvider
    .when('/particle-page', {
      templateUrl: 'views/particle.html',
      controller: 'ptclCtrl'
    })
});

// ptclCtrl.js
app.controller('ptclCtrl', function($scope){
  var canvas = document.getElementById("ptclCanvas");
  var ctx = canvas.getContext("2d");
  ctx.canvas.width  = 500;
  ctx.canvas.height = 500;
});

//particle.html
<canvas id='ptclCanvas'></canvas

第一次,这工作正常。第二次,画布重置为其原始默认值。我不确定为什么会这样?我做错了吗,有没有Angular的方法可以做到这一点?我要做的第二件事是添加和动画粒子,因为我怀疑同样的问题,所以我无法实现,我的 Array 变量仅在第一次加载时初始化。任何帮助表示赞赏,我一直在努力寻找解决方案数周!

【问题讨论】:

  • 您能发布一下您是如何进行路由的,以及如何使用 ptclCtrl 吗?
  • 当然!我刚刚更新了我的帖子以包含一些 app.js 和particle.html。这不是整个块,只是相对的部分。谢谢。

标签: javascript angularjs controller reload


【解决方案1】:

那根本不是 Angular。在 Angular 中,你永远不会(和我重复一遍)在控制器中进行 DOM 操作。如果您发现自己这样做,请不要这样做。

DOM 操作是在指令中完成的,因此您可以执行以下操作:

app.directive('resizeCanvas', function() {
  return {
    link: function(scope, element, attrs) {
      var ctx = element[0].getContext("2d");
      ctx.canvas.width  = 500;
      ctx.canvas.height = 500;
    } 
  };
});

然后:

<canvas resize-canvas></canvas>

这将为您调整大小,不涉及控制器。

【讨论】:

  • 啊哈!我知道这将是一个“用 Angular 思考”的问题。非常感谢您指出。哇,我现在将不得不重新审视我所有的其他控制器。但这是否意味着我会在这里添加我所有的 js 代码?例如,我将在画布上添加粒子并为其设置动画,这将与用户的鼠标交互。所有这些都会放在这里还是在Angular中有另一种方式。非常感谢任何为我指明正确方向的帮助!
  • 按你解释的方式。是的,您可以创建一个指令来执行所有这些粒子动画并将其粘贴在画布上,就像我在示例中所做的那样。
  • 太棒了!非常感谢你的帮助。这是我第一次尝试用 Angular 做任何事情,真的需要重新布线才能理解:D
【解决方案2】:

将需要执行一次的逻辑放在运行块或配置中。这样它只会被初始化一次

执行顺序:

app.config()
app.run()
app.controller() 

var app = angular.module('myApp',[]);

app.run(function() {
});

【讨论】:

  • 感谢您的帮助,但没有奏效。每次在特定视图上时,我都需要调用脚本。我尝试将脚本放在 app.run 中的一个函数中并从 ptclCtrl 控制器调用它,但这给了我与开始时相同的结果,即:在第一次加载时有效,在第二次加载时无效。
猜你喜欢
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 2019-11-09
相关资源
最近更新 更多