Javascript AngularJS 1.x-$scope检查显示$scope.data,但直接访问$scope.data==未定义
我正在监视$scope.taskId,然后尝试访问$scope.data上的属性 以下是我的功能:Javascript AngularJS 1.x-$scope检查显示$scope.data,但直接访问$scope.data==未定义,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我正在监视$scope.taskId,然后尝试访问$scope.data上的属性 以下是我的功能: $scope.$watch('taskId', function(value) { console.log('here---------------'); console.log($scope, $scope.data); var titlePrefix = undefined; if (value) { titlePrefix = $scope.g
$scope.$watch('taskId', function(value) {
console.log('here---------------');
console.log($scope, $scope.data);
var titlePrefix = undefined;
if (value) {
titlePrefix = $scope.getTaskTitlePrefix();
Page.setTitle(titlePrefix + $scope.taskId);
$scope.loadData();
}
});
我正在第3行记录上面的$scope和$scope.data
(console.log($scope$scope.data);)
以下是控制台中的输出:
这里---------------
m{$$childTail:m,$$childHead:b,$$nextSibling:m,$$watchers:
数组(81),$$listeners:Object…}
未定义
你知道为什么$scope看起来已经准备好并可用了,但它的变量却没有吗
这是初始化taskId变量的HTML,正如您所看到的,这里有很多事情要做。这是一个主要的Laravel和Angular应用程序,超过2700页,不包括供应商或节点文件夹(1700+Laravel,1000+Angular)
下面是浏览器控制台中$scope检查的$scope.data变量部分,以提供规模感
数据:m
美元承诺
:
D
$resolved
:
真的
报警日期
:
无效的
反病毒州
:
无效的
分配给
:
104
上大学时间
:
0
自动预订
:
1.
订票费
:
无效的
预订费
:
无效的
建立
:
数组(0)
取消原因
:
无效的
客户
:
对象
客户识别码
:
53
客户端类型
:
“客户”
收集于
:
无效的
完整的
:
0
已填妥
:
无效的
创建于
:
"2016-12-07 11:23:03"
创建于
:
16
造物主
:
对象
客户通知
:
数组(0)
删除
:
无效的
交付
:
0
交付人
:
无效的
装置
:
数组(0)
直拨
:
无效的
到期日
:
无效的
交换id
:
无效的
反馈
:
无效的
跟踪id
:
无效的
格式化时间
:
""
格式化时间
:
""
身份证件
:
84222
发票号
:
无效的
发票
:
0
发票金额为
:
无效的
按项目开具发票
:
0
劳动
:
0
修饰语
:
对象
需要你的电话吗
:
0
需要送货吗
:
无效的
没有价格原因
:
无效的
没有理由
:
无效的
现场终端
:
"0000-00-00 00:00:00"
现场启动
:
"0000-00-00 00:00:00"
订单任务id
:
无效的
支付
:
0
支付
:
"2016-12-07"
部分
:
数组(0)
零件总数
:
0
通过测试
:
无效的
密码
:
数组(0)
大头针
:
无效的
要点
:
0
预录
:
0
预订日期
:
"01-01-1970"
问题
:
“已删除”
项目编号
:
无效的
qa_id
:
无效的
qa_任务
:
数组(0)
相关任务
:
数组(0)
返回标识
:
无效的
修订历史
:
数组(0)
满意的客户
:
无效的
六翼天使
:
无效的
严重性
:
2.
架子
:
无效的
架子式
:
无效的
网站
:
对象
站点id
:
53
网站用户
:
对象
站点\用户\ id
:
535
标准价格
:
无效的
标准价格
:
无效的
地位
:
对象
身份证
:
1.
订阅用户
:
数组(0)
订户
:
数组(0)
子类型标识
:
1.
模板项目
:
数组(0)
模板
:
数组(0)
花费的时间
:
0
标题
:
“为了纳迪姆”
类型
:
“支持”
无人值守时间
:
0
更新地址
:
"2016-12-07 11:24:04"
更新人
:
94
用户
:
反对
----------------编辑00.14-----------------
这里有一个loadData函数,它对LaravelAPI进行ajax调用,并将响应分配给$scope.data
$scope.loadData = function() {
Tasks.get({taskId: $scope.taskId}, function(response){
$scope.data = response;
$scope.modified = false;
CustomerNotificationsService.setNotifications(response.customer_notifications);
$ClientsManager.setClient(response.client);
$ClientsManager.setClientType(response.client_type);
$scope.registerWatchers();
}, ErrorsHandler);
};
其实简单的修复
只需在new$watch中查看我感兴趣的数据属性,并将对Page.setTitle的调用拉入其中
$scope.$watch('taskId', function(value) {
if (value) {
$scope.loadData();
}
});
// set browser tab title prefix
$scope.$watch('data.type', function(value) {
var browserTabTitlePrefix = undefined;
if(typeof value != 'undefined') {
browserTabTitlePrefix = $scope.getBrowserTabTitlePrefix(value);
Page.setTitle(browserTabTitlePrefix + $scope.taskId);
}
});
现在,因为我正在查看正确的属性,并且只在子函数(Page.setTitle)准备好后调用它,所以我很高兴
Alhamdulillaah katheerun所有范围观察程序都执行一次,但范围尚未准备就绪。(将此视为一种初始化…)如果在作用域上监视
数据
,并在监视程序中设置断点,则第一次运行将使用未定义的值,但是第二次数据应该完全填充。您何时/何地分配$scope.data?@angabriel-如何设置断点以及如何知道$scope.data何时准备就绪?@Kossel$scope.data及其子属性分布在tasks.blade.php中-我使用atom搜索数据,共搜索了224次@OP:看这里,第二点“用断点暂停代码”。
archDB.factory('Page', function () {
var title = 'Seraph';
return {
getTitle: function() { return title; },
setTitle: function(newTitle) { title = newTitle; }
};
});
$scope.loadData = function() {
Tasks.get({taskId: $scope.taskId}, function(response){
$scope.data = response;
$scope.modified = false;
CustomerNotificationsService.setNotifications(response.customer_notifications);
$ClientsManager.setClient(response.client);
$ClientsManager.setClientType(response.client_type);
$scope.registerWatchers();
}, ErrorsHandler);
};
$scope.$watch('taskId', function(value) {
if (value) {
$scope.loadData();
}
});
// set browser tab title prefix
$scope.$watch('data.type', function(value) {
var browserTabTitlePrefix = undefined;
if(typeof value != 'undefined') {
browserTabTitlePrefix = $scope.getBrowserTabTitlePrefix(value);
Page.setTitle(browserTabTitlePrefix + $scope.taskId);
}
});