首页 > 关于apply的问题

关于apply的问题

目前开发的是用angular开发的单页面管理项目,目前遇见了几个问题可能都和apply有关,但自己的知识量不足以明白到底是什么问题,所以求解。
<a href="javascript:;" ng-click="BslistCtrl.updateinfo(list.id)">
    <span class="glyphicon glyphicon-edit"></span>编辑
</a>

触发updateinfo事件后:

vm.updateinfo = function (id) {        
     info_get(id);
}

function info_get(id){        
    BrandStoresResourrce.get(vm.seid,id).then(function(data){            
        vm.updateinfo = data;    
        console.log(vm.updateinfo)        
    })
}

/**
 * 获取单个连锁品牌
 */
function get(seid,id){                 
    return $.ajax({
        type:"get",
        url:"/api-admin/brand/"+id+"/get",
        dataType:"json",
        data:{"device":device,"version":version,"sessionId":seid},
        async:false,            
        success:function(response){
            return response.data;
        }
    });
}

就这么一段点击后根据ID获取数据信息,第一下都能成功,但是第二次以后就会突然报错。调试了很久也没发现个什么问题的所在,怀疑起了apply(),但是这个页面并没有引用。只是其他页面控制器使用了。目前的所有控制器和服务都是用gulp自动化合并到一个文件的,不知道会不会有冲突呢?

下面是报错图。

下面是断点调试的第二次点击的地方

刚接触angular所以很多东西不是很熟悉,但请指教下问题。求解~


angular里面是这么写的

<div ng-app="myApp" ng-controller="myCtrl">
    内容
</div>
var app = angular.module('myApp', []);//需要写对应的module
app.controller('myCtrl', function($scope, $http) {//需要写对应的controller,还有把$scope, $http注入进去
    $http.get("路径").success(function(response) {
        $scope.names = response.records;
    });
});

你的语法没写对,几样东西你都木有,当然没有controller你也可以这么写:把下面的放到run()方法里面

$rootScope.$apply(function(){
    $http({
        method: 'GET',
        url: '路径'
    });
});

不过还是建议你使用第1种。
建议你先去看入门教程和官方文档

补充:$apply()函数可以从Angular框架的外部让表达式在Angular上下文内部执行。例如,假设你实现了一个setTimeout()或者使用第三方库(如jquery)并且想让事件运行在Angular上下文内部时,就必须使用$apply()。
$apply()函数接受一个可选的参数:(字符串/函数)
如果传入一个字符串,$apply()首先会在这个字符串上调用$eval(),以强制Angular在局部作用域上下文中使用$eval()运行字符串表达式。
如果传入一个函数,这个函数将会在所传入的函数作用域上执行。
你用angular自己定义的东西比如ng-click、ng-keypress等一系列,ng会会自己调用$apply()来更新视图,而你用使用第三方框架(比如jQuery、Facebook API),或者调用setTimeout(),ng不会调用$apply(),你就会发现视图没有更新,所以你要手动调用$apply(),
写了这么多相信你应该能理解这个了,还比较通俗易懂吧!

还有:你function get(seid,id){}return的是javascript对象吧,你调用的时候还加上then(function(data){})这就有问题了,直接就vm.updateinfo = BrandStoresResourrce.get(vm.seid,id);了


都已经是返回promise()对象了,还是ajax里面写success函数干嘛。你这样写出来呢 不大好看,也不知道你service.js 里面具体是怎么写的。

【热门文章】
【热门文章】