问题标签 [angularjs-scope]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rest - AngularJS 控制器/服务/http 通信
我已经将我的 REST API 封装在一个注入控制器的 AnguarJS 服务中。很标准,对。现在我希望该服务拦截任何 401 响应并以某种方式触发注销或重新登录提示或其他内容。问题是:该服务无权访问任何范围。广播该错误的最佳方法是什么?我提出了一些想法,但我是 Angular 的新手,想知道是否有人可以告诉我这样做的“Angular”方式?
1)我可以让服务充当我的 AppCtrl 可以监听的事件池。但这似乎有点过于复杂。所以:
2)我可以将 $rootScope 注入服务,并直接修改服务isLoggedIn
。但这似乎完全是错误的。我想明确区分服务服务数据、控制器控制范围以及指令与 dom 混在一起的地方。
3)我的每个控制器都可以监视一个被拒绝的承诺,如果原因是 401 错误,然后到达 $scope 并设置isLoggedIn
为 false,但这个选项显然很糟糕。
有什么帮助吗?
谢谢。
javascript - 模型更改时未更新角度视图(DOM 元素)
在最新的稳定版 Chrome 中运行最新的稳定版 Angular。我在带有 ng 控制器 A 的视图内的 DOM 元素上进行了 ng-click,但 DOM 元素本身有一个 ng-controller 设置为另一个控制器 B. ng-click 在控制器 B 内触发,但是会更改范围属性, ng-model 属性绑定到哪个 DOM 元素,不会被反映。
具体来说,我有一个 textarea,以及其他 HTML5 输入类型。没有错误,当我在调试器中中断时,我可以查看范围变量并看到 $scope 实际上指向控制器 B。
Plnkr 示例在这里,请注意它如何只更新同一 DIV 内的输入?:http ://plnkr.co/edit/DmccNj?p=preview
javascript - 错误:没有控制器:ngModel
当我添加ng-change="reverseOrder=this.checked"
到复选框时,如下所示:
我得到以下异常:
我尝试向输入框添加ng-model
一个包含整个视图和标签的 div <html>
,这会产生如下异常:
这里发生了什么?我认为我不需要明确引入模型。我已经阅读了Angular 文档,但并不明智。
提前致谢。
戴夫
angularjs - 在指令中,$watch 触发两次,将 newValue 恢复为原始的 $watch 触发前值
我很确定我做错了什么,因为我对 Angular 的经验很少。可能答案已经在stackoverflow的某个地方,我没有问(谷歌搜索)正确的问题。
我有这个非常简单的指令。它只是一个有四种状态的跨度,我想在每次点击跨度时改变它。每次单击都会将状态向前推进,然后循环返回。每个州都有不同的 CSS 类。我希望每次指令的值更改时父模型上的值都会更改(因此在隔离范围声明中使用“=”,对吗?)。
我对值进行了监视以更改类,以便每次值更改时都会更新css类。
现在,问题是当我单击时,手表会使用 newValue 触发,但随后手表会再次触发 newValue 等于单击前的值。
我认为这与脏检查和与父控制器模型的连接有关,但是,这样做的正确角度方式是什么?和/或有更好、更棱角分明的方式来获得相同的结果?
这里的指令:
这里>>小提琴<<
javascript - 我可以避免 ng-repeat 循环中的对象变量名吗?
当定义一个 ng-repeat 指令来迭代一个数组时,语法指定ng-repeat="friend in friends"
,然后在模板中使用 interoplation 运算符,如下所示{{friend.name}}
。
是否可以将属性分配给当前项目范围,而不是其中的变量?所以我可以打电话{{name}}
而不是{{friend.name}}
?
原因是我的指令在两个不同模板的范围内使用 - 例如,我可能有一个指令"userActions"
既用于转发器,也用于不相关的模板,{{friend.name}}
但没有意义。我想避免人为地制造friend
没有语义的对象。
我的用例是这样的:
我有一个渲染各种类型块的网格。一些伪代码:
我还有一个朋友页面,其中包含完全相同的用户操作:
现在,如果我想使用中继器内块的属性,语法是{{block.name}}
. 所以模板userActions
包含这个。
但是,一旦我在朋友页面中使用了这个模板,我必须{{block.name}}
在朋友控制器的范围内创建。但这没有意义,因为块仅存在于块网格的上下文中。我不应该创建这个block
。
我想要做的只是{{name}}
从userActions
指令模板中调用,因为块范围和控制器都包含它。我不想创建一个对象,然后在我想使用该指令的每个范围内block
人为地设置。block.name
userActions
这是一个jsFiddle 来说明原因
javascript - 如何在第一次加载时选择 AngularJS 模型?
我正在使用 AngularJS 来填充选择选项列表。
我默认选择一个选项,具体取决于字段 isMandatory。但问题是我无法在第一次加载时获取所选项目的 ID。
当我更改选项时它会起作用。
请检查此 plunker 代码:http ://plnkr.co/edit/U2dVeo1vwZZPFKVhPleV?p=preview
angularjs - 如何从父范围检查包含 ng 的表单的有效性?
我有一个在我的应用程序中的多个视图之间共享的子表单。在一个视图中,此子表单单独显示,底部有一个后退/继续按钮,可将用户引导至下一个子表单。在另一个视图中,子表单与其他子表单(基本上是一个长表单)显示在同一页面上。
由于子表单的 html 在两个视图中都是 100% 相同的,因此我将它分成一个部分并ng-include
用于渲染它。在仅显示带有后退/继续按钮的子表单的视图中,我在父 HTML 中呈现后退/继续按钮。
从视觉上看,一切正常,我可以访问在表单 ( user.email, user.password, user.etc...
) 中输入的所有数据。
问题是我根据用户是否正确完成表单来启用/禁用“继续”按钮,这在“仅子表单”变体中不起作用,因为父范围似乎没有能够访问表单的状态。如果我将按钮粘贴在部分中,它可以工作,但我不想这样做,因为在使用此部分的每个实例中按钮都不属于那里。
请注意,在我的示例中,红色边框内的提交按钮被禁用,直到在框中键入内容并且“表单无效?” 值更新,而蓝色边框内的按钮始终处于启用状态并且“表单无效?” 值为空白。
如何myForm.$invalid
从父范围访问值?
angularjs - 可以使用 $$prevSibling 访问“transcluded”指令中的范围数据吗?
我的指令设置如下:
- 我正在使用嵌入来确保
directiveB
得到渲染。 directiveA
有一个复选框,用于在选中时更改某些值。- 此值需要在
directiveA
anddirectiveB
的范围内可访问。
我已经设法做到这一点,但只能通过引用$$prevSibling
- 有没有更好的方法?
这是代码: http: //jsfiddle.net/janeklb/yugQf/(在此示例中,单击复选框只是为了“清除”该值)
--
更深入一点:(directiveA
被嵌入其中的内容)的“内容”并不总是directiveB
. 其他类似directiveB
的指令也将在那里结束。“directiveB
类型”将始终在directiveA
.
angularjs - Angular JS:当视图外观相同时,使用 ng-repeat 处理来自每个视图重复的不同 UI 组件
为大标题道歉,我想不出更好的东西。让我解释一下我遇到的问题。
我必须渲染三张卡片,每张卡片都有相同的外观,这意味着它们每个都有一个标题部分和一个正文部分。我正在使用 ng-repeat 从模型中获取数据并渲染这些卡片。
代码:
现在,这些卡片的每一个主体都应该有不同的 UI。例如,一张卡片的 body 可能有一个使用 Hight Charts 的图表,另一张卡片可能只想使用 jQuery UI 库中的 UI,等等。
当我使用 ng-repeat 循环时,我将如何实现它?让我知道我的起始方向是否正确?
模型数据如下所示:
在这方面寻求帮助。
谢谢你。
javascript - 在角度指令中从父级继承的新范围
假设我这样做:
如何使该指令的范围从父范围继承变量,但仍使其成为“隔离”范围
例如来自角度文档:
= 或 =attr - 在本地范围属性和通过 attr 属性值定义的 name 的父范围属性之间建立双向绑定。如果未指定 attr 名称,则假定属性名称与本地名称相同。给定范围的widget定义:{localModel:'=myAttr'},那么widget范围属性localModel将在父范围上反映parentModel的值。对 parentModel 的任何更改都将反映在 localModel 中,而对 localModel 的任何更改都将反映在 parentModel 中。
但是在这种情况下,由于“localModel 中的任何更改都将反映在 parentModel 中”,如果我在该指令的范围内修改变量,然后在这种情况下执行 scope.apply(),它将相应地反映在父范围和父模板中将随更改更新
我也尝试将“范围:true”作为参数,但更改了范围,然后是 scope.$apply(); 也将传播到原始范围...
有没有办法让我可以从父范围复制一个范围,并且该范围内的变量仍然有更改不会传播到父范围?