当前位置: 首页 > 知识库问答 >
问题:

AngularJS1.x-$scope检查显示$scope.data,但直接访问$scope.data==未定义

魏学智
2023-03-14

我正在监视$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+Angular)

<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中使用,它实际上设置了浏览器选项卡的标题,而不是任何“on page”标题的标题。

>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>

这是getTitle函数,当taskId发生变化时,它将被调用。

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

下面是来自浏览器控制台的$scope检查的$scope.data变量部分,以提供缩放感。

数据:m$承诺:d$解析:true alarm_date:空antivirus_state:null assigned_to:104 attended_time:0 auto_booked:1预订费:空booking_fee_id:空生成:数组(0)cancelled_reason:空客户端:对象client_id:53客户端类型:“Client”collected_at:已完成null:0已完成_AT:created_at为空:“2016-12-07 11:23:03”创建人:16创建者:对象customer_notifications:数组(0)deleted_at:传递得空:0 delivered_by:空设备:数组(0)direct_dial:空due_date:空exchange_id:空反馈:followup_id为空:空formatedAttendedTime:“”formatedUnattendedTime:“”id:84222发票号:空发票:0 invoiced_at:null invoiced_by_project:0人工:0修改符:对象needs_calling:0 needs_delivery:no_price_reason为空:空nopassword_reason:空onsite_end:“0000-00-00 00:00:00”onsite_start:“0000-00-00 00:00:00”order_task_id:空付款:0 paid_at:“2016-12-07”零件:数组(0)parts_total:0通过_QA:空密码:阵列(0)引脚:空点:0预购:0 prebook_date:“01-01-1970”问题:“已删除”project_id:空qa_id:null qa_tasks:Array(0)related_tasks:Array(0)return_id:null revision_history:Array(0)satisfied_client:null seraph_id:null severity_id:2 shelf:null shelf_type:null site:Object site_id:53 site_user:Object site_user_id:535 standard_price:null standard_price_id:null status:Object status_id:1 subscribed_user:null Array(0)

-------------编辑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个答案

马渊
2023-03-14

其实很简单;

只需在new$watch中查看我感兴趣的data属性,并将对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)准备就绪后才调用它,所以我很高兴。

哈姆杜利拉赫·卡西伦

 类似资料:
  • 我想使用输入值在角控制器,我做了一个按钮,称为函数,在控制器内定义,当我得到控制器内的值显示未定义的值。请检查我的代码,告诉我哪里错了,对不起这个愚蠢的问题,但我是新的.提前感谢 角度控制器: Html代码:

  • 问题内容: 到目前为止,我们使用了几个Linux用户: system_foo @ server system_bar @服务器 … 我们希望将系统用户放入docker容器中。 linux用户->容器 服务器内部的更改没有问题,但是远程系统使用这些用户向我们发送数据。 我们需要工作。远程系统无法更改。 如果每个linux操作系统只有一个系统(将端口22传递到容器),我将非常容易。但是有几个。 我们如

  • 我已经开发了Angular 8应用程序,我正在使用routerLink导航组件,这些组件工作正常,没有任何问题,但是当我直接在浏览器中输入相同的URL时,它不会显示任何内容,在控制台中,我看到的错误如下所示 例如,我打开主页http://localhost:4200/home我在这里添加了routerLink,以便http://localhost:4200/about我将能够成功地查看,但如果我输

  • 问题内容: 我正在处理,并且想将a另存为查询。这甚至有可能吗?无论如何,这是我的查询: 它确实可以在AnySQL Maestro中工作,但是不能在Access中工作。 问题答案: Access数据库引擎确实支持CHECK约束,但是不能从Access中的查询设计器中执行创建约束的DDL。必须使用VBA代码和ADO连接创建它们,如下所示:

  • 问题内容: 我正在将文件(pdf,doc,flv等)加载到缓冲区中,并通过脚本将其提供给我的用户。我需要我的脚本能够访问文件,但不允许直接访问它。什么是实现这一目标的最佳方法?我应该使用我的权限来做某事还是使用.htaccess锁定目录? 问题答案: 最安全的方法是将想要保留的文件放到Web根目录之外,就像Damien建议的那样。之所以可行,是因为Web服务器遵循本地文件系统特权,而不是其自身的特

  • 问题内容: 我们将AngularJS嵌入到我们的Django应用程序中,URL路由由AngularJS ui- router 处理。使用ui- sref并在应用程序内单击可在所有部分之间进行良好的导航。 问题是当用户导航到非根目录页面(例如),并且用户刷新浏览器,重新加载浏览器的URL或直接将非根URL粘贴到浏览器中时。在这种情况下,用户将被重定向到根页面(),而不是在浏览器中加载保留相同URL的