你有幾個選項。
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