- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序中,我想保留对某些代码部分使用普通 Controller 的选项 - 而不是为永远不会重复使用的一次性事物创建指令。
在这些情况下,我经常想从 Controller 发布一些数据以在包含的部分中使用。现在,我知道我可以简单地绑定(bind) Controller 范围内的项目,但是我想明确指定“模型”位置,只是为了使代码更易于维护且更易于阅读。我想使用的是 ng-model,因为它将用于自定义指令,但就在我的普通 Controller 旁边:
<div ng-controller="AppController" ng-model='fooModel'>
{{fooModel}}
</div>
但是,我认为如果不使用指令和“require”注入(inject),就无法获取对生成的 ngModelController 的引用。
我知道我可以通过将 $attr 注入(inject)我的 Controller 并执行类似以下操作来相当轻松地创建自己的属性:
<div ng-controller="AppController" my-model='fooModel'>
{{fooModel}}
</div>
在这种情况下,我只需手动获取或解析 myModel 值并将我的模型粘贴到该名称下的 $scope 中。然而,在这种情况下感觉不对 - 我真的只需要一个 Controller 的“模型”,并且我不希望在 ngModel 存在时将此样板添加到每个 Controller 中。 (这就是事情的原理!)
我的问题是:
1) 有没有办法将 ngModel 与 plain Controller 一起使用来获得上面的效果?
2)我一直试图找出 ngModelController 的存储位置,以便我可以查看调试器中的情况,但一直无法找到它们。使用 ngModel 指令时,我应该在作用域还是父作用域中看到这些指令吗? (他们住在哪里?!?)
更新:正如下面的答案中所建议的, $element.controller() 可用于获取 Controller 。这可行( http://plnkr.co/edit/bZzdLpacmAyKy239tNAO?p=preview )但是有点不令人满意,因为它需要使用 $evalAsync。
最佳答案
2) I have been trying to figure out where ngModelControllers are stored so that I could look at the situation in the debugger but have not been able to find them. When using an ngModel directive should I see these in the scope or parent scope? (Where do they live?!?)
答案稍微取决于您想要从哪里访问 Controller 。
从元素外部使用ng-model
它需要带有 ng-model
的元素上的“name”属性属性和父表单(或 ngForm
)。假设您的表单名称为 myForm
以及带有 ng-model
的元素名称为 myInput
的属性,然后您可以访问ngModelController
对于 myFoo
来自父范围 myForm.myInput
。例如,出于调试目的:
<p>myFoo: {{myForm.myInput.$modelValue}}<p>
<form name="myForm">
<div ng-controller="InnerController" name="myInput" ng-model="model.foo"></div>
</form>
如http://plnkr.co/edit/IVTtvIXlBWXGytOEHYbn?p=preview所示
从元素内部使用 ng-model
类似于answer from @pixelbits ,使用$evalAsync
由于 Controller 创建的顺序,需要它,但您也可以使用 angular.element.controller 函数来检索它:
app.controller('InnerController', function($scope, $element) {
$scope.$evalAsync(function() {
$scope.myModelController = $element.controller('ngModel');
});
});
用于在 Controller 内部查看它,用于调试目的,如下:
<div ng-controller="InnerController" ng-model="model.foo">
<p>myFoo: {{myModelController.$modelValue}}<p>
</div>
如http://plnkr.co/edit/C7ykMHmd8Be1N1Gl1Auc?p=preview所示。
<小时/>1) Is there some way to use ngModel along with a plain controller to get the effect above?
一旦您拥有ngModelController
在指令内部,您可以更改其值,就像使用自定义指令访问 ngModelController
一样。 ,使用$setViewValue
功能:
myModelController.$setViewValue('my-new-model-value');
例如,您可以执行此操作,以响应触发 ngChange
的用户操作。处理程序。
app.controller('InnerController', function($scope, $element) {
$scope.$evalAsync(function() {
$scope.myModelController = $element.controller('ngModel');
});
$scope.$watch('myModelController.$modelValue', function(externalModel) {
$scope.localModel = externalModel;
});
$scope.changed = function() {
$scope.myModelController.$setViewValue($scope.localModel);
};
});
注意 $modelValue
上的额外观察者获取模型的初始值,并对以后的任何更改使用react。
它可以与如下模板一起使用:
{{model.foo}}
<div ng-controller="InnerController" ng-model="model.foo">
<p><input type="text" ng-model="localModel" ng-change="changed()"></p>
</div>
请注意,这使用 ngChange
而不是 localModel
上的观察者。这是故意的,以便 $setViewValue
仅当用户与元素交互时调用,而不是响应父范围对模型的更改。
这可以在http://plnkr.co/edit/uknixs6RhXtrqK4ZWLuC?p=preview处看到
<小时/>编辑:如果您想避免 $evalAsync
,您可以使用观察者来代替。
$scope.$watch(function() {
return $element.controller('ngModel');
}, function(ngModelController) {
$scope.myModelController = ngModelController;
});
如http://plnkr.co/edit/gJonpzLoVsgc8zB6tsZ1?p=preview所示
<小时/>顺便说一句,到目前为止,我似乎已经避免了像这样嵌套普通 Controller 。我想如果模板的某个部分的作用就是通过ngModel
来控制一个变量,它是编写小指令的主要候选者,通常具有隔离的作用域,以确保不会因作用域继承而产生意外影响,具有清晰的 API,并使用 require
访问ngModelController
。是的,它可能不会被重用,但它确实有助于强制代码各部分之间的职责分离。
关于angularjs - 使用 ngModel 和普通 ngController 而不是指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25346318/
事情是这样的: {{something}} 出于某种原因,我无法访问另一个 Controller 的 div 中的 controller1.Data.someId,但我
出于各种原因,我有几个包装 PrimeNG 组件的自定义组件。我的组件的一些实例以 react 形式使用,并且字段的“要求”是使用 Validators.required 验证器设置的。 PrimeN
我正在尝试在自定义组件上使用 ngControl。我已经创建了组件并在组件上实现了 ControlValueAccessor。 然后在构造函数中,注入(inject) NgControl 如下: co
我有一个 angularJS 应用程序的工作实现,它从 URL 中获取一些链接并绘制它们。然而,URL 上的链接会不断更新,我想定期更新此 $scope.liSTLinks,假设每 10 秒更新一次。
在我的 Angular 应用程序中,我有一个动态更改输入组件的表单。所有动态组件都是 ControlValueAccessor 的实现。 如果您在 Input 中输入值,然后更改组件(单击“将组件更改
一旦我导入 FormsModule,我就会开始收到此错误。我正在使用 MatFormField,但它似乎不能与 FormsModule 一起使用。 最佳答案 我刚刚用与您相同的错误消息解决了我的问题。
我有以下内容(https://jsfiddle.net/hhgqup4f/5/): Parent Controller 是: app.controller("Controller", Con
这是一个骗子:http://plnkr.co/edit/F6QM4KUU8DPNq6muInGS?p=preview 使用 ng-include 包含 html 文件,并在同一标记中设置 ng-con
我在理解如何使用 ng-controller 时遇到了一些困难。我在 eventController.js 中有一个表单 Controller 。 My Event:{{event.na
我想知道这两种创建 Controller 的用例是什么: 使用 ngController: myApp.controller('myController', ['$scope', function (
如何使用 ngControl在 contenteditable元素?例如,我想要: 通过绑定(bind)(?)将其绑定(bind)到模型驱动的“表单”(表格)。我用 formBuilder 创建了
如何从单元测试中访问注入(inject)的 ngControl?如何解决错误? 在组件中 constructor( @Self() @Optional() public ngControl:
我正在尝试创建自定义 angular 2 验证器指令,它像这样注入(inject) NgControl: @Directive({ selector: '[ngModel][customValid
我有以下 Angular 2 形式: {{'FIRST_NAME_FORM.MIN_
在 Angular 2 形式中,尝试通过 ngSubmit 获取数据。我可以毫无问题地在我的表单组件中分配 ngModel 和 ngControl 属性,但是在子组件 MyInput 中,我无法在没有
我很难尝试在表单中同时使用 *ngIf 和 ngFormModel 来验证所述表单。 用例是这样的:根据用户输入,隐藏或停用表单中的某些特定字段。但如果显示这些输入,则必须对其进行验证。 当只需要基本
在我的应用程序中,我想保留对某些代码部分使用普通 Controller 的选项 - 而不是为永远不会重复使用的一次性事物创建指令。 在这些情况下,我经常想从 Controller 发布一些数据以在包含
我正在构建一个自定义组件,它实现了 ControlValueAccessor,因此我可以在我的 from.xml 中将其与 ngControl 和 ngModel 一起使用。现在我想要逻辑来验证组件是
我正在构建一个自定义组件,它实现了 ControlValueAccessor,因此我可以在我的 from.xml 中将其与 ngControl 和 ngModel 一起使用。现在我想要逻辑来验证组件是
我正在尝试按照 Kara Erickson 在上一个 Angular Connect 上推荐的方式实现自定义 ControlValueAccessor https://youtu.be/CD_t3m2
我是一名优秀的程序员,十分优秀!