AngularJS 1.x - $ scope.data在$ watch中未定义,即使$ scope似乎可用

时间:2017-06-13 11:35:21

标签: angularjs scope watch

我正在观看$ scope.taskId,然后尝试访问$ scope.data上的属性。

这是我的功能:

$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:   Array(81),$$ listeners:Object ...}

     

未定义

任何想法为什么$ scope似乎已经准备好并且可用,但它的变量不是??

--------------------- edit 14.06.17 ----------------------

这是初始化taskId变量的HTML,你可以看到这里有很多东西。这是一个主要的Laravel和Angular应用程序,超过2700页,不包括供应商或节点文件夹(1700+ Laravel,1000 +角)

<div ng-controller="TasksCtrl" ng-init="taskId = '{!! $task->id !!}'" ng-cloak>
    <span ng-init="severities = {{ json_encode($severities) }}"></span>
    <span ng-init="statuses = {{ $statuses }}"></span>
    <span ng-init="users = {{ $users }}"></span>
    <span ng-init="subtypes = {{ App\Modules\Bookings\TaskSubtype::support()->get() }}"></span>
    <span ng-init="standard_prices = {{ StandardPrice::all() }}"></span>
    <span ng-init="shelf_types = {{ json_encode(App\Modules\Bookings\Task::getShelfTypes()) }}"></span>

这是来自tasks.blade.php文件的摘录,该文件是页面的内容。

实际标题用于layouts.blade.php,它实际上设置了浏览器标签的标题, NOT 标题是任何“页面上”标题。

(head)

(meta charset="utf-8")
(meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1")

<title ng-controller="TitleController" ng-cloak>{[{ Page.getTitle() }]}</title>

(我必须使用括号()而不是&lt;&gt;因为Stack的降价不允许&gt; head&lt;或&gt; meta&lt;标记,原因很明显。)

如果它有帮助,这就是getTitle函数。

archDB.factory('Page', function () {
    var title = 'Seraph';
    return {
        getTitle: function() { return title; },
        setTitle: function(newTitle) { title = newTitle; }
    };
});

这是来自浏览器js控制台的$ scope.data变量检查 给人一种规模感。

数据:m $承诺 : d $解决 : 真正 alarm_date : 空值 antivirus_state : 空值 分配给 : 104 attended_time : 0 auto_booked : 1 预订费 : 空值 booking_fee_id : 空值 建立 : 阵列(0) cancelled_reason : 空值 客户 : 宾语 CLIENT_ID : 53 client_type : “客户” collected_at : 空值 完成 : 0 completed_at : 空值 created_at : “2016-12-07 11:23:03” 由...制作 : 16 创造者 : 宾语 customer_notifications : 阵列(0) deleted_at : 空值 交付 : 0 由某人交付 : 空值 设备 : 阵列(0) 直拨 : 空值 截止日期 : 空值 EXCHANGE_ID : 空值 反馈 : 空值 followup_id : 空值 formatedAttendedTime : “” formatedUnattendedTime : “” ID : 84222 发票编号 : 空值 发票 : 0 invoiced_at : 空值 invoiced_by_project : 0 劳工 : 0 修改 : 宾语 needs_calling : 0 needs_delivery : 空值 no_price_reason : 空值 nopassword_reason : 空值 onsite_end : “00:00:00” onsite_start : “00:00:00” order_task_id : 空值 支付 : 0 paid_at : “2016年12月7日” 部分 : 阵列(0) parts_total : 0 passed_qa : 空值 密码 : 阵列(0) 销 : 空值 点 : 0 prebook : 0 prebook_date : “01-01-1970” 问题 : “已移除” PROJECT_ID : 空值 qa_id : 空值 qa_tasks : 阵列(0) related_tasks : 阵列(0) return_id : 空值 修订记录 : 阵列(0) satisfied_client : 空值 seraph_id : 空值 severity_id : 2 架 : 空值 shelf_type : 空值 现场 : 宾语 SITE_ID : 53 site_user : 宾语 site_user_id : 535 standard_price : 空值 standard_price_id : 空值 状态 : 宾语 STATUS_ID : 1 subscribed_user : 阵列(0) 用户 : 阵列(0) subtype_id : 1 template_items : 阵列(0) 模板 : 阵列(0) 所花费的时间 : 0 标题 : “对于Nadeem” 类型 : “支持” unattended_time : 0 的updated_at : “2016-12-07 11:24:04” updated_by : 94 用户 : 对象

2 个答案:

答案 0 :(得分:0)

范围和范围变量都已准备就绪。获得undefined的原因是您需要首先初始化并为范围变量赋值。否则,它将显示为未定义。

$scope.data = "whatever";

$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();
    }
});

答案 1 :(得分:0)

$ scope属于控制器,不使用更多的观察者,不是很好的做法。您可以按如下方式在HTML中分配变量

<input ng-model="data">

或在控制器中

$scope.data = "AngularJS 4.0 is out. Enjoy.";

我们可以使用一次分配的值来限制视图和控制器中的任何位置。