这里的简单问题。 我有这样的手表:
// Watch our model
$scope.$watch(function () {
// Watch our team name
return self.model.team.data.name;
}, function (name) {
console.log(name);
// if we have a name
if (name) {
// Store our model in the session
sessionStorage.designer = angular.toJson(self.model);
}
});
团队模型是从数据库中作为承诺(因此是数据)引入的,因此当手表首次触发时, self.model.team 尚未设置,因此它为空。 如何让我的手表等到它被设置或添加检查手表的返回功能?
答案 0 :(得分:2)
使用监视表达式而不是函数。这将捕获丢失对象的任何错误并返回undefined
。
// Watch our model
$scope.$watch('self.model.team.data.name', function (name) {
console.log(name);
// if we have a name
if (name) {
// Store our model in the session
sessionStorage.designer = angular.toJson(self.model);
}
});
答案 1 :(得分:1)
这里没有任何魔力 - 如果您访问的其中一个变量可能是null
/ undefined
,那么如果null
/ {undefined
/ { {1}}。所以,你必须要防范:
$scope.$watch(
function(){
return (self.model.team && self.model.team.data.name) || undefined;
},
function(v){
// ...
});
唯一的魔法"是你" $ watch"对于表达式,但表达式需要在范围上公开。所以,你可以这样做:
$scope.model = self.model;
$scope.$watch("model.team.data.name", function(v){
// ...
});
但是,实际上,你必须问自己为什么在这里需要$watch
。在我看来,你异步获得team
一次 - 看起来它不会改变,除非可能是另一个异步调用。因此,只需在没有$watch
的情况下收到数据时处理:
someSvc.getTeam() // I made an assumption about a service that pulls the data from db
.then(function(team){
var name = team.data.name;
// if we have a name
if (name) {
// Store our model in the session
sessionStorage.designer = angular.toJson(self.model);
}
});
不必要的$watch
是昂贵的 - 它会在每个摘要周期进行评估,因此,最好减少$ watchers的数量。