GVKun编程网logo

一个控制器中的AngularJS window.onbeforeunload正在另一个控制器上触发(在控制器上使用此按钮)

19

这篇文章主要围绕一个控制器中的AngularJSwindow.onbeforeunload正在另一个控制器上触发和在控制器上使用此按钮展开,旨在为您提供一份详细的参考资料。我们将全面介绍一个控制器中的

这篇文章主要围绕一个控制器中的AngularJS window.onbeforeunload正在另一个控制器上触发在控制器上使用此按钮展开,旨在为您提供一份详细的参考资料。我们将全面介绍一个控制器中的AngularJS window.onbeforeunload正在另一个控制器上触发的优缺点,解答在控制器上使用此按钮的相关问题,同时也会为您带来Angular Js新手-控制器视图中的链接触发另一个控制器动作、angularjs – Angular Calling Modal从一个控制器到另一个控制器的打开功能、angularjs – 一个控制器可以调用另一个?、angularjs – 两个指令共享同一个控制器的实用方法。

本文目录一览:

一个控制器中的AngularJS window.onbeforeunload正在另一个控制器上触发(在控制器上使用此按钮)

一个控制器中的AngularJS window.onbeforeunload正在另一个控制器上触发(在控制器上使用此按钮)

这是我的问题,我有两个视图(View1和View2)和每个视图的控制器(Ctrl1和Ctrl2)。在View1中,我试图警告用户,他不经意地离开页面而不保存更改。

我正在使用window.onbeforeunload,它的工作原理很好,但我的问题是,即使我只有在一个控制器上只能运行,事件似乎也被触发在第二个控制器!但我甚至没有那个事件在那里。当用户离开页面并且存在未保存的更改时,如果用户关闭警报并离开页面,他将被接收到第二个视图,如果用户尝试离开此视图,则会被onbeforeunload警告,我们也会收到关于未保存更改的警告!甚至不是这样的情况!为什么会发生这种情况?

我也使用$ locationChangeStart,它工作得很好,但只有当用户更改路由时,而不是刷新浏览器,点击“返回”或尝试关闭它,这就是为什么我被迫使用onbeforeunload如果你是一个更好的方法,请让我知道)。任何帮助或更好的方法将不胜感激!

//In this controller I check for window.onbeforeunload
app.controller("Ctrl1",function ($scope,...)){
  window.onbeforeunload = function (event) {        

    //Check if there was any change,if no changes,then simply let the user leave
    if(!$scope.form.$dirty){
      return;
    }

    var message = 'If you leave this page you are going to lose all unsaved changes,are you sure you want to leave?';
    if (typeof event == 'undefined') {
      event = window.event;
    }
    if (event) {
      event.returnValue = message;
    }
    return message;
  }

  //This works only when user changes routes,not when user refreshes the browsers,goes to prevIoUs page or try to close the browser
  $scope.$on('$locationChangeStart',function( event ) {    
    if (!$scope.form.$dirty) return;
    var answer = confirm('If you leave this page you are going to lose all unsaved changes,are you sure you want to leave?')
    if (!answer) {
      event.preventDefault();
    }
  });
}

//This other controller has no window.onbeforeunload,yet the event is triggered here too!
app.controller("Ctrl2",...)){
  //Other cool stuff ...
}

我尝试使用$ location.path()检查当前路径,以便在视图中警告用户,我希望触发onb​​eforeunload,但这似乎是一个“hacky”,解决方案是在另一个上执行onbeforeunload控制器。

我在第一个添加了$ location.path()!=’/ view1’,似乎有效,但对我来说似乎不对,除了我不仅有两个意见,我有几个意见,这将得到涉及更多控制器的棘手:

app.controller("Ctrl1",then simply let the user leave
    if($location.path() != '/view1' || !$scope.form.$dirty){
      return;
    }

    var message = 'If you leave this page you are going to lose all unsaved changes,are you sure you want to leave?')
    if (!answer) {
      event.preventDefault();
    }
  });
}
当定义它的控制器超出范围时,取消注册onbeforeunload事件:
$scope.$on('$destroy',function() {
    delete window.onbeforeunload;
});

Angular Js新手-控制器视图中的链接触发另一个控制器动作

Angular Js新手-控制器视图中的链接触发另一个控制器动作

有角的新手在这里。

假设我有一个应用程序,它需要监视不同的事物,例如“提交的新闻”,“登录尝试次数”等等。我的mainController的职责是获取有关这些操作的信息,从服务中获取这些数据并在简单的仪表板上显示这些信息。

<div ng-controller=''mainController''>      + ---------------------+      | NEWS Submitted: 1233 |      | Login attempts: 233  |      + ---------------------+</div><div ng-controller=''newsController''></div><div ng-controller=''loginAttemptsController''></div>

我想使数据编号可单击,然后单击它们,我希望该应用程序(不更改路线)在相对div中显示所单击数据的详细信息。因此,例如新闻提交列表或登录尝试的详细信息。我想在自己的控制器中处理所提交新闻的详细信息并尝试登录。

问题是:如何使ng-click事件告诉angular调用另一个控制器的特定功能?

答案1

小编典典

这就是它的工作方式-

  1. 从您的mainController向上发出一个事件(通过$ emit)。对$ emit的调用通过范围层次结构向上调度事件名称,通知已注册的$ rootScope.Scope侦听器。

  2. 在newsController和loginAttemptsController内部,添加一个事件侦听器(使用$ rootScope。$ on)来侦听mainController发出的事件,从目标作用域(在您的情况下为mainController的作用域)获取数据,并将其设置为newsController和loginAttemptsController的作用域模型。

有关详细信息,经过角文档-
https://docs.angularjs.org/api/ng/type/
$ rootScope.Scope

我已经在这里设立了普拉克-
http://plnkr.co/edit/1dhdPfmB1WwAkYhsz4Hv

示例代码(html模板):

<div ng-controller="mainController">    <button data-ng-click="OnNewButtonClick()">Show News</button>    <button data-ng-click="OnLoginAttemptButtonClick()">Show Login Attempts</button></div><div ng-controller="newsController">    {{newsControllerData.News}}</div><div ng-controller="loginAttemptsController">    {{loginAttemptsControllerData.loginAttempts}}</div>

示例代码(主控制器):

app.controller("mainController", ["$rootScope", "$scope", function ($rootScope, $scope) {    $scope.newsControllerData = {};    $scope.loginAttemptsControllerData = {};    // from mainController emit HandleNews upwards on the scope    $scope.OnNewButtonClick = function () {        $scope.newsControllerData.info = "Hello World";        $scope.$emit("HandleNews");    }    // from mainController emit HandleLoginAttempts upwards on the scope    $scope.OnLoginAttemptButtonClick = function () {        $scope.loginAttemptsControllerData.info = "login count = 4";        $scope.$emit("HandleLoginAttempts");    }}]);

示例代码(新闻控制器):

app.controller("newsController", ["$rootScope", "$scope", function ($rootScope, $scope) {    $scope.newsControllerData = {};    // when any controller calls HandleNews, i would listen    $rootScope.$on("HandleNews", function (evt, next, current) {        $scope.newsControllerData.News = evt.targetScope.newsControllerData.info;    });}]);

示例代码(loginAttempts控制器):

app.controller("loginAttemptsController", ["$rootScope", "$scope", function ($rootScope, $scope) {    $scope.loginAttemptsControllerData = {};    // when any controller calls HandleLoginAttempts, i would listen    $rootScope.$on("HandleLoginAttempts", function (evt, next, current) {        $scope.loginAttemptsControllerData.loginAttempts = evt.targetScope.loginAttemptsControllerData.info;    });}]);

angularjs – Angular Calling Modal从一个控制器到另一个控制器的打开功能

angularjs – Angular Calling Modal从一个控制器到另一个控制器的打开功能

我的标题中有一个模态窗口,标题中有一个Click事件链接,用于打开和关闭模态窗口……这样可以正常工作.即

<divng-controller="headerCtrl">
...
          <li><a href ng-click="open()">Report an Issue</a></li>
...
</div>

然后我的控制器

.controller('headerCtrl',['$location','$scope','$log','$modal',function ($location,$scope,$log,$modal) {
    'use strict';
    (function () {// init
      $scope.open = function (size) {
        var modalinstance = $modal.open({
          templateUrl: 'views/help/supportModalContent.html',controller: 'supportInstanceCtrl'
        });
      };
    })();
  }])

  .controller('supportInstanceCtrl','$modalinstance','$state',$modalinstance,$state) {
    'use strict';
    (function () {// init
      $scope.ok = function () {
        $modalinstance.close($scope.selected.item);
      };
      $scope.isCollapsed = false;
      $scope.message_sent = false;
    })();

    $scope.cancel = function () {
      $modalinstance.dismiss('cancel');
    };

    $scope.faq = function () {
      $modalinstance.close('cancel');
      $state.go('faq');
    };

    $scope.help = function () {
      $modalinstance.close('cancel');
      $state.go('help');
    };

    $scope.send = function () {
      $scope.isCollapsed = true;
      $scope.message_sent = true;
    };
  }])

问题现在出现在我的一个主要内容视图中,我现在还有一个链接,下面点击此处点击支持.我想再次打开相同的模态窗口.所以我这样做了

.controller('noresultCtrl','search',search,$state,$modal) {
    'use strict';
    $scope.open = function (size) {
      var modalinstance = $modal.open({
        templateUrl: 'views/help/supportModalContent.html',controller: 'supportInstanceCtrl'
      });
    };
  }])

并且它有效但是有一个更好的方法,而不是必须将相同的逻辑放在我想在标题中调用相同的模态窗口的每个控制器中吗?

解决方法

app.service('modalProvider',['$modal',function ($modal){

this.openPopupModal= function() {
var modalinstance = $modal.open({
          templateUrl: 'views/help/supportModalContent.html',controller: 'supportInstanceCtrl'
        });
}

在控制器中包含此服务,并调用openPopupModal方法.例如:

.controller('noresultCtrl','modalProvider',modalProvider) {
    'use strict';
modalProvider.openPopupModal();

angularjs – 一个控制器可以调用另一个?

angularjs – 一个控制器可以调用另一个?

有可能有一个控制器使用另一个?

例如:

这个HTML文档只是在MessageCtrl.js文件中打印由MessageCtrl控制器发送的消息。

<html xmlns:ng="http://angularjs.org/">
<head>
    <Meta charset="utf-8" />
    <title>Inter Controller Communication</title>
</head>
<body>
    <div ng:controller="MessageCtrl">
        <p>{{message}}</p>
    </div>

    <!-- Angular Scripts -->
    <script src="http://code.angularjs.org/angular-0.9.19.js" ng:autobind></script>
    <script src="js/messageCtrl.js" type="text/javascript"></script>
</body>
</html>

控制器文件包含以下代码:

function MessageCtrl()
{
    this.message = function() { 
        return "The current date is: " + new Date().toString(); 
    };
}

它只打印当前日期;

如果我要添加另一个控制器,DateCtrl将特定格式的日期交给MessageCtrl,那么如何做呢? DI框架似乎关心XmlHttpRequests和访问服务。

有多种方式如何在控制器之间通信。

最好的一个可能是共享服务:

function FirstController(someDataService) 
{
  // use the data service,bind to template...
  // or call methods on someDataService to send a request to server
}

function SecondController(someDataService) 
{
  // has a reference to the same instance of the service
  // so if the service updates state for example,this controller kNows about it
}

另一种方式是在范围上发出事件:

function FirstController($scope) 
{
  $scope.$on('someEvent',function(event,args) {});
  // another controller or even directive
}

function SecondController($scope) 
{
  $scope.$emit('someEvent',args);
}

在这两种情况下,您都可以与任何指令进行通信。

angularjs – 两个指令共享同一个控制器

angularjs – 两个指令共享同一个控制器

具有以下指令
function directive() {
    return {
        template: '{{foo.name}}',controller: ctrl,controllerAs: 'foo'
    }
}

function ctrl($attrs) {
    this.name = $attrs.name;
}

这在一个模板中:

<directive name="1" />
<directive name="2" />

为什么我看到以下输出:

2
2

代替

1
2

选项controllerAs:’foo’执行以下操作:
$scope.foo = new ctrl()

您的指令未指定范围,这意味着您的指令使用其父级($parentScope)的范围.在您的情况下,两个指令实例使用相同的父范围.所以这两个指令:

<directive name="1" />
<directive name="2" />

工作喜欢:

>< directive name =“1”/&gt ;: $parentScope.foo = new ctrl().在控制器内:$parentScope.foo.name = 1.
>< directive name =“2”/&gt ;: $parentScope.foo = new ctrl(). (步骤1中的实例被覆盖).在控制器内:$parentScope.foo.name = 2.
所以最后两个指令是指在第二个控制器实例上定义的相同名称.

解决方案:使用隔离范围为@Michelem mentions.

关于一个控制器中的AngularJS window.onbeforeunload正在另一个控制器上触发在控制器上使用此按钮的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Angular Js新手-控制器视图中的链接触发另一个控制器动作、angularjs – Angular Calling Modal从一个控制器到另一个控制器的打开功能、angularjs – 一个控制器可以调用另一个?、angularjs – 两个指令共享同一个控制器等相关知识的信息别忘了在本站进行查找喔。

本文标签: