- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个由多个模块组成的单页 AngularJS 应用程序,其目的是为用户提供协作 pad(主小部件)和其他相关小部件(其他连接的用户、pad 元数据等)。
我选择拆分应用如下:
让我们通过假设我只有 1 个小部件来简化它,其唯一目标是向用户显示状态消息:“正在验证”、“已验证”、“错误”或“就绪”。
我选择在服务中使用订阅/通知模式,让小部件收到共享组件状态更改的通知。
服务:
angular.module("app.core").factory("padService", padService);
function padService() {
// Callback registration and notification code omitted
return {
initialize: function (authToken) { ... },
onAuthenticated: function (callback) { ... },
onReady: function (callback) { ... },
onError: function (callback) { ... }
};
}
小部件:
angular.module("app.widget").directive("widget", widget);
function widget() {
return {
templateUrl: 'app/widget.html',
restrict: 'E',
controller: widgetController
};
}
function widgetController($scope, padService) {
$scope.message = "authenticating";
padService.onAuthenticated(function (user) {
$scope.message = "authenticated";
// Do other stuff related to user authentication event
});
padService.onReady(function (padInstance) {
$scope.message = "ready";
// Do other stuff related to pad readiness event
});
padService.onError(function (error) {
$scope.message = "error";
// Do other stuff related to error event
});
}
现在“初始化器模块”以其最简单的形式从 URL 片段(类似于 OAuth2)中收集身份验证 token authToken
并简单地调用 padService.initialize(authToken);
。请注意,它也可以是专用的身份验证弹出窗口,这就是为什么它驻留在自己的模块中的原因。
我的问题是我不知道将那段代码放在哪里。我尝试过的所有地方都导致在 Angular Bootstrap 过程中放置得太早和/或没有更新小部件:
angular.module("app.initializer").run(run);
function run($document, $timeout, tokenService, padService) {
// This does not work because run() is called before the
// controllers are initialized (widget does not get notified)
var authToken = tokenService.getTokenFromUrl();
padService.initialize(authToken);
$document.ready(function () {
// This does not work because angular does not detect
// changes made to the widget controller's $scope
var authToken = tokenService.getTokenFromUrl();
padService.initialize(authToken);
// This does not work in firefox for some reason (but
// does in chrome!)... except if I enter debug mode or
// set the timeout to a longer value, which makes it
// either really difficult to diagnostic or ugly as hell
$timeout(function () {
var authToken = tokenService.getTokenFromUrl();
padService.initialize(authToken);
}, 0);
});
}
最佳答案
The controllers are created synchronously (I assume), so there shouldn't be any difficulty to make some code run after that.
这是一个错误的假设。 AngularJS 框架在应用程序的生命周期中定期创建和销毁指令及其 Controller 。 ng-repeat
、ng-if
、ng-include
等都创建和销毁包含指令的 DOM。如果您的“小部件”是 ng-repeat
的一部分,它的 Controller 会被实例化多次,一次是针对 ng-repeat
监视的列表中的每个项目。
要保留在应用程序的整个生命周期中持续存在的数据,请将其保存在服务中。 (或在 $rootScope
上;不推荐,但可以选择。) Controller 不能假定它们已在引导期间启动。他们需要“ catch ”并订阅更改。
将持久数据保存在工厂服务中,并提供setter和getter函数。
angular.module("app").factory("padService", function () {
//Store service status here
var status = "none-yet";
function setStatus(s) {
status = s;
return status;
};
function getStatus() {
return status;
};
return {
setStatus: setStatus,
getStatus: getStatus
};
});
在您的“小部件”中,注入(inject)服务、订阅更改和“追赶”。
angular.module("app").directive("widget", function() {
function widgetController($scope, padService) {
//subscribe with $watch
$scope.$watch(padService.getStatus, function(newStatus) {
//catch-up and react to changes
case (newStatus) {
"authenticated":
// Do stuff related to authenticated state
break;
"ready":
// Do stuff related to pad ready state
break;
"error":
// Do stuff related to error state
break;
default:
// Do something else
}
$scope.message = newStatus;
};
};
return {
templateUrl: 'app/widget.html',
restrict: 'E',
controller: widgetController
}
});
当指令首先使用 AngularJS 框架 $watch
注册监听器时,执行 watch 函数(在本例中为 padService.getStatus
),然后执行监听器函数.这允许指令“ catch ”服务的当前状态。
在每个摘要周期,AngularJS 框架执行 padService.getStatus
。如果状态发生变化,框架将以新状态作为第一个参数执行监听器函数。这允许指令对更改使用react。
您不能假设指令及其 Controller 是同步创建的。但是您确实知道服务在被注入(inject) Controller 之前被实例化并且其构造函数被执行。
关于javascript - 在AngularJS中,如何在所有 Controller 初始化后运行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34858440/
我是 Spring 新手,这就是我想要做的事情: 我正在使用一个基于 Maven 的库,它有自己的 Spring 上下文和 Autowiring 字段。 它的bean配置文件是src/test/res
我在我的测试脚本中有以下列表初始化: newSequenceCore=["ls", "ns", "*", "cm", "*", "ov", "ov", "ov", "ov", "kd"] (代表要在控
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Class construction with initial values 当我查看 http://en.
我得到了成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非常量静态成员的类内初始化”。这是主类: #include #include "Tree.h" using n
我有如下所示的a.h class A { public: void doSomething()=0; }; 然后我有如下所示的b.h #include "a.h" class b: publi
我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 DataSnapshot 来手动解析它进入二
我使用 JQuery 一段时间了,我总是使用以下代码来初始化我的 javascript: $(document).ready( function() { // Initalisation logic
这里是 Objective-C 菜鸟。 为什么会这样: NSString *myString = [NSString alloc]; [myString initWithFormat:@"%f", s
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我对这一切都很陌生,并且无法将其安装到我的后端代码中。它去哪里?在我的页脚下面有我所有的 JS? 比如,这是什么意思: Popup initialization code should be exec
这可能是一个简单的问题,但是嘿,我是初学者。 所以我创建了一个程序来计算一些东西,它目前正在控制台中运行。我决定向其中添加一个用户界面,因此我使用 NetBeans IDE 中的内置功能创建了一个 J
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
据我所知, dependentObservable 在声明时会进行计算。但如果某些值尚不存在怎么办? 例如: var viewModel ={}; var dependentObservable1 =
我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。 class Gear attr_reader :chainring, :cog, :wheel de
我按照 polymer 教程的说明进行操作: https://www.polymer-project.org/3.0/start/install-3-0 (我跳过了可选部分) 但是,在我执行命令“po
很抱歉问到一个非常新手的Kotlin问题,但是我正在努力理解与构造函数和初始化有关的一些东西。 我有这个类和构造函数: class TestCaseBuilder constructor(
假设我们有一个包含 30 列和 30 行的网格。 生命游戏规则简而言之: 一个小区有八个相邻小区 当一个细胞拥有三个存活的相邻细胞时,该细胞就会存活 如果一个细胞恰好有两个或三个活的相邻细胞,那么它就
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我是一名优秀的程序员,十分优秀!