1、$http.post发的数据,后台取不到

我用的是springMVC框架,前端提交数据使用了$http.post(url,data)方法,不知道为什么总是取不到data数据。如果直接用$.post(url,data); 就可以!

 $http.post('spring/mvc', { user: userForm, test: 'test' }).success(function(){ alert("保存成功"); });

后台的一个controller:

                @RequestMapping(value = "/mvc",method = RequestMethod.POST)
@ResponseBody
public
void setMenu(User user, String test) {
System.out.println("user= " + user.toString());System.out.println("test = " + test); }

打印出来,始终是null.如果直接用$.post就可以正常打印出: test

 $.post('spring/mvc', test: 'test' }); 

针对以上问题的最终解决方案是:

              test: 'test test'
},
transFn = function(data) {
return $.param(data);
},
postCfg
= {
headers
: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
transformRequest
: transFn
};
$http
.post(url, data, postCfg)
.
success(function(){
alert("成功")
;
});

var url = 'spring/mvc', data = { # user: JSON.stringify(userForm), user: angular.toJson(userForm),#此处使用angular.toJson方法的原因在下面说明

2、scope中的数据明明改变了但是为什么页面却没有更新?

这种问题可能是由于没有进入AngularJS自己的Context中去而引起无法对视图进行更新导致的,这个时候你可能要手动进行更新

你可以尝试使用$apply或者$digest,但也不要过度滥用$digest,毕竟每次调用都是要消耗很多的资源的,但有时候调用了会遇到如下的报错:

遇到这种问题一般是由于在手动调用$digest的时候使用不当造成的,使用如下的封装就可以了

  
  
varupdateUI=function(){if(!$scope.$$phase){$scope.$digest();}};varupdateRootUI=function(){if(!$rootScope.$$phase){$rootScope.$digest();}};

3、提交的数据多了会出现很多$$hashKey怎么办

比如下面的数据

这个是因为$$hashKey是AngularJS为了做DirtyCheck加的haskKey,解决这个办法也很简单,在做序列化处理的时候使用angular.toJson函数

代替JSON.stringify来序列化数据即可,这也是一个问题中为什么将JSON.stringify注掉使用angular.toJson的原因。


解决该问题除了使用angular.toJson函数来序列化以外还可以自己在 ng-repeat 的时候写上 track by也可以避免出现$$hashKey。

比如 track by $index 或

 <div ng-controller="Test">
     <button ng-click="request()">请求新数据</button>
         // 使用 track by 标识
       <div ng-repeat="user in users track by user.id">
          {{user.name}}
       </div>
 </div>
以上两种方式均可避免出现 $$hashKey,具体为什么会出现这种问题呢?

在查看 ng-repeat 的源码时可以发现,当 ng-repeat 的数组被替换时,它默认并不会重新利用已有的 Dom 元素,而是直接将其全部删除并重新生成新的数组 Dom 元素:

 // 将上次生成的所有 dom 移除
 for (key in lastBlockMap) {
 if (lastBlockMap.hasOwnProperty(key)) {
  block = lastBlockMap[key];
  elementsToRemove = getBlockElements(block.clone);
  $animate.leave(elementsToRemove);
  forEach(elementsToRemove,function(element) { element[NG_REMOVED] = true; });
  block.scope.$destroy();
 }
     }

Dom 的频繁操作是非常不友好的,为什么 ng-repeat 不能利用已有的 dom 元素去更新数据呢?因为你没有把数组元素的标识属性告诉它,

那么两次替换的时候它就没办法追 踪了,我们可以看到 ng-repeat 往数组里每个元素加了一个 $$hashKey 的属性:


这个 key 是由 Angular 内部的 nextUid() 方法生成的,类似数据库自增,但是使用的是字符串。

现在我们明白了,因为每次替换数组都会导致 ng-repeat 为每个元素生成一个新 key,所以根本没办法重用已有的 Dom 元素,那么我们可以使用下边的语法来避免这个问题:

 <div ng-controller="Test">
    <button ng-click="request()">请求新数据</button>
 // 使用 track by 标识
     <div ng-repeat="user in users track by user.id">
        {{user.name}}
     </div>
 </div>

这样 ng-repeat 就会将其缓存起来啦,当然可能你的数组元素没有一个标识属性,如果元素数量不多那么可以接受,不然还是建议你手动为其生成一个标识属性。


4、页面加载为什么会有那么多404?

这个一般是由于模板里面直接使用了src,请使用ng-src替代src,这里提一下,sodaRender里请使用soda-src

<img ng-src="{{user.name}}" />


5、多层循环嵌套时$index重复的问题

这个跟第三条中提到的是一样的,使用track by 语法(sodaRender也支持)就可以了

<li ng-repeat="user in users track by $subindex"></li>


6、自己封装的Directive,如何像ng-model一样好用

这里可以使用directive中的require配置项,将ng-model Directive引进来,并在合适的时间调用setViewValue方法,如下:

7、ng-model想使用个性化问题

有些时候,ng-model并不能满足所有的场景需求,这个时候可以考虑使用set、get方法做一层拦截,这样就可以更好的控制数据绑定,如下

然而在1.3+的版本中,angularJS似乎也意识到了ng-model的这一点,所以它开放了API允许我们进行拦截

只不过,AngularJS讲set和get方法合二为一,这一点也是比较巧妙的。


以上这些问题汇总仅供有需要的同学参考,如有更好的解决方法欢迎在下面留言,共同学习、交流

在使用angularjs时遇到的几个问题的更多相关文章

  1. iOS 10 Safari问题在DOM中不再包含元素

    使用此链接,您可以重现该错误.https://jsfiddle.net/pw7e2j3q/如果您点击元素并从dom中删除它,然后单击链接测试.你应该看到旧的元素弹出选择.是否有一些黑客来解决这个问题?解决方法我能够重现这个问题.问题是,每当您尝试删除其更改事件上的选择框时,iOS10都无法正确解除对选择框的绑定.要解决此问题,您需要将代码更改事件代码放在具有一些超时

  2. ios – 有没有办法针对存档版本(.ipa)运行XCTest(UI)?

    要么我们可以单独构建和测试,以便我们可以先构建并在以后对该构建进行测试吗?

  3. ios app如何“知道”运行单元测试

    我知道我可以用xcodebuild开始我的应用程序的单元测试,但我想知道是什么告诉应用程序在启动期间运行测试,它是一个发送到应用程序的特殊参数,还是以不同的方式编译以运行测试?

  4. ios – 如何在Swift中正确转换为子类?

    我有一个带有许多不同单元格的UITableView,基于数据源内容数组中的内容,它们应该显示自定义内容.在这里我得到了错误UITableViewCell没有属性customLabelQuestionTableViewCell有哪些.我的演员到QuestionTableViewCell有什么问题?解决方法问题不是你的演员,而是你的细胞宣言.您将其声明为可选的UITableViewCell,并且该声明

  5. xcode – 添加OCMock会导致Test启动主应用程序而不是运行测试

    我正在尝试将Ocmock添加到我现有的Cocoa项目中,但我遇到了一个我没有看到其他人覆盖的奇怪问题.我最终将它分离到以下内容:如果我只是将Ocmock.framework引用添加到我的项目中(即以某种方式将其拖到LinkBinaryWithLibraries构建阶段),当我运行测试时,真正的应用程序将被启动.没有Ocmock,输出正常:使用Ocmock框架链接(部分输出):此后,其他应用程序输出

  6. Xcode:用于条件DEBUG / TEST代码的预处理器宏

    我在我的代码(例如AppDelegate.m)中有不应该为单元测试编译的部分,例如当您在创建新项目时选择“添加单元测试”时,目标是由Xcode设置的.在项目文件中,我已将标志CONfigURATION_TESTS添加到内置目标的MyAppTests的预处理器宏中,但未添加到MyApp目标.这是我发现的许多帖子中的建议方式.但是这不起作用,因为(我猜)MyAppTests目标将MyApp目标作为依赖

  7. ios – 嵌套递归函数

    我试图做一个嵌套递归函数,但是当我编译时,编译器崩溃.这是我的代码:编译器记录arehere解决方法有趣的…它似乎也许在尝试在定义之前捕获到内部的引用时,它是bailing?以下修复它为我们:当然没有嵌套,我们根本没有任何问题,例如以下工作完全如预期:我会说:报告!

  8. ios – Swift 3 – 将文件夹从主包复制到文档目录

    我的主要包中包含文件夹,我想在首次启动应用程序时将它们复制/剪切到文档目录,以便从那里访问它们.我见过一些例子,但他们都在Obj-C中,我正在使用Swift3.我怎么能这样做?解决方法我设法使用2个功能:

  9. ios – 如何本地化应用程序名称?

    我用cocos2d写了一个游戏并翻译了所有的图像和文字两种不同语言的游戏.当应用程序启动时,我根据区域设置加载不同的资源设备和这一切都运行正常.然后,当我上传此应用程序进行审核时,我首先将其命名为“test”.然后在本地化部分我添加一种语言“日语”.但我发现在“日语元数据部分”中,我可以编辑很多除“appname”之外的东西,即“test”.但我想要我的应用程序显示根据设备的区域设置也有不同的名称.有人能告诉我如何开展这项工作吗?

  10. Swift split

    转:http://www.cocoachina.com/bbs/read.PHP?tid=207275SwiftString扩展/**@String扩展*@Date:2014/06/17*/importCocoaextensionString{//分割字符funcsplit(s:String)->String[]{ifs.isEmpty{varx=String[]()foryinself{x.ap

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部