AngularJS 1.5:范围。$ watch内部链接功能不会更新模型更改

时间:2016-07-12 15:36:43

标签: javascript angularjs typescript angularjs-scope

美好的一天 每个人

我正在开发网络应用,使用打字稿 angular 1.5 ;

我创建了一个指令,主要目标是监视用户是否登录,并隐藏/显示相应的元素。

以下是链接功能 代码

interface ShowAuthedScope extends ng.IScope{
  User: UserService,
  _$log: ng.ILogService
}

function ShowAuthedDirective(User:UserService, $log:ng.ILogService) {
  'ngInject';

  return {
    restrict: 'A',
    link: function (scope, element, attrs) {
      scope.User = User;
      scope._$log = $log;
      scope.$watch('User.current', function (val) {
        scope._$log.log('updated!:', val);
      })
    }
  }
}

我案例的模型是当前用户,根据他是否登录而设置或取消设置。

这是 UserService 剪辑代码

interface UserInterface {
  current:GoogleUser;
  signIn(options?:SignInOptions):Promise<any>;
  signOut():Promise<void>;
}

class UserService implements UserInterface {
  public current:GoogleUser;
  private _GoogleAuth:GoogleAuthService;
  private _AppConstants;

  constructor(GoogleAuth:GoogleAuthService, AppConstants) {
    'ngInject';
    this._GoogleAuth = GoogleAuth;
    this._AppConstants = AppConstants;
    this.current = null;
  }

  public signIn(options?:SignInOptions) {
    let promise:Promise<any>;
    let _options:SignInOptions = options || {};
    _options.app_package_name = this._AppConstants.appPackageName;
    if (this.current) {
      promise = this.current.signIn(_options);
    } else {
      promise = this._GoogleAuth.signIn(_options);
    }
    promise = promise.then((googleUser:GoogleUser) => this.current = googleUser);
    return promise;
  }


  public signOut() {
    this.current = null;
    return this._GoogleAuth.signOut();
  }

}

$ watch中的函数在初始化后仅触发一次;

另请注意,我已尝试传递真实作为$ watch函数的第三个参数

希望得到你的帮助!谢谢!

1 个答案:

答案 0 :(得分:1)

当您从控制台调用signInsignOut时,它会发生在称为“摘要周期”的内容之外。 Angular在每个摘要周期中运行$ watch语句,但是需要发生触发它的东西。

例如ng-click和所有Angular事件处理程序自动触发摘要周期,以便可以检测到变量更改。

总而言之,如果您想从控制台执行所有操作,则需要自己触发摘要周期:

angular.element(document).injector().get('$rootScope').$digest()