Angularjs 扩展$scope

Angularjs 扩展$scope,angularjs,scope,Angularjs,Scope,我试图在AngularJS中创建一些对$scope服务普遍有用的扩展: (此代码在所有控制器之外定义): 第一个扩展名为safeApply(),可以工作,但是当我在上面的代码中添加alertOn()时,即使没有调用$scope.alertOn(),我的应用程序也不再工作。我一辈子都看不出我做错了什么。我的错误隐藏在显而易见的地方,这是不是很明显?on->$on如前所述 及 应该是: $scope.$apply(fn); var phase = $scope.$root.$$phase; //

我试图在AngularJS中创建一些对$scope服务普遍有用的扩展:

(此代码在所有控制器之外定义):


第一个扩展名为
safeApply()
,可以工作,但是当我在上面的代码中添加
alertOn()
时,即使没有调用
$scope.alertOn()
,我的应用程序也不再工作。我一辈子都看不出我做错了什么。我的错误隐藏在显而易见的地方,这是不是很明显?

on->$on
如前所述 及

应该是:

$scope.$apply(fn);
var phase = $scope.$root.$$phase; // or $scope.$$phase;
以及:

应该是:

$scope.$apply(fn);
var phase = $scope.$root.$$phase; // or $scope.$$phase;
然而,我会重写您的代码,使用$timeout,因为angular的摘要周期不是一成不变的

$timeout(function() {
   // code to by "apply'ed" to be digested next cycle
});

我使用
angular.extend
解决了这个问题,如下所示:

"use strict";


// Safely apply changes to the $scope
// Call this instead of $scope.$apply();

var ExtendScope = function ($scope) {

        angular.extend($scope, {
            safeApply: function (fn) {
                var phase = this.$root.$$phase;
                if (phase == '$apply' || phase == '$digest') {
                    if (fn && (typeof (fn) === 'function')) {
                        fn();
                    }
                } else {
                    this.$apply(fn);
                }
            },

            alertOn: function (eventName, message) {
                this.$on(eventName, function () { alert(message); });
            }
        });
};
所以现在在我的控制器中,我可以简单地添加,例如

$scope.alertOn('save_succeeded', "Saved.");
这就行了


谢谢你的回答

是您的朋友:)您将参数指定为
eventName
,但将其用作
eventName
(小写“n”)!!!你确定没有人叫它吗?控制台上有错误吗?除了Nikos提到的
eventName
/
eventName
,难道不是正确的方法
$on
,而不仅仅是
on
?因为代码是编写的,并且预期会被调用,
这个
就是
$scope
。因此,这在这个问题上不会有任何区别,尽管它可能是一个好主意,只是为了防止不合理的使用。
$scope.alertOn('save_succeeded', "Saved.");