你有几个选项。
1-使用服务和广播事件。
// service
app.service("DataService", function($rootScope) {
var _name = '';
var result = {
setName : function(name) {
_name = name;
$rootScope.$broadcast("nameChanged", _name);
},
getName : function() {
return _name;
}
}
return result;
});
// controller(s)
app.controller("ObservingController", function($scope) {
$scope.$on("nameChanged", function(name) {
console.log("Something changed with name.");
});
});
// other controllers
app.controller("ModifyingController", function($scope, DataService) {
// triggers the broadcast
DataService.setName("bob");
});
2)留意变化与表达
// controller - use the same DataService as above
app.controller("WatchingController", function($scope, DataService) {
// bind the service to the scope for the expression
$scope.DataService = DataService;
$scope.$watch("DataService.getName()", function(newVal, oldVal) {
console.log("Name changed " + newVal);
});
});
这是给你,你喜欢什么。我的服务也写得很差,仅仅是一个例子。 $ rootScope仅用于向所有子范围广播。我不建议在那里存储数据。在数据上下文的情况下,如果将其包装在服务中并公开,则可以将服务(或由服务公开的变量)绑定到示例中,并且您的手表应触发。
// service
app.service("DataContextService", function() {
var context = {
firstName : "",
lastName : ""
};
return {
context : context
};
});
// controller
app.controller("Watcher", function($scope, DataContextService) {
$scope.context = DataContextService.context;
$scope.$watch("context.firstName", function(newVal, oldVal) {
console.log("Change..");
});
});
app.controller("Modifier", function($scope, DataContextService) {
// causes the watch to trigger
DataContextService.context.firstName = "Bob";
});
这个想法是“在datacontext和view之间没有链接”。 当我使用ParentCtrl时,我的数据被链接到特定的视图。 我的数据不需要关于ui的任何知识,它的刚好可以被任何控制器/视图使用的数据。 – 2014-09-02 08:10:35
这是真的userContext是在他的生命周期之外。 Angular使用称为脏检查的技术观察变量。 所以你只能使用控制器内部的变量。 Knockout使用Observable模式。这对我来说效果更好。 http://blog.nebithi.com/knockoutjs-vs-angularjs/ 对我来说不会有完美的解决方案:s – 2014-09-02 08:46:16
的确,它完全取决于您的需求,无论Knockout还是AngularJs都是最合适的。 – 2014-09-02 09:14:37