AngularJS 1.x - $ scope检查显示$ scope.data但直接访问$ scope.data == undefined

时间:2017-06-14 22:42:00

标签: 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.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似乎已经准备好并且可用,但它的变量不是??

这是初始化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>

这是在taskId更改时调用的getTitle函数。

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

这是来自浏览器控制台的$ scope检查的$ 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   用户   :   对象

----------------编辑00.14 -----------------

这是一个loadData函数,它对laravel api进行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);
};

1 个答案:

答案 0 :(得分:0)

实际上简单修复;

只需在新的$ 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