美好的一天 每个人!
我正在开发网络应用,使用打字稿和 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函数的第三个参数
希望得到你的帮助!谢谢!
答案 0 :(得分:1)
当您从控制台调用signIn
和signOut
时,它会发生在称为“摘要周期”的内容之外。 Angular在每个摘要周期中运行$ watch语句,但是需要发生触发它的东西。
例如ng-click
和所有Angular事件处理程序自动触发摘要周期,以便可以检测到变量更改。
总而言之,如果您想从控制台执行所有操作,则需要自己触发摘要周期:
angular.element(document).injector().get('$rootScope').$digest()