gpt4 book ai didi

angularjs - 如何在没有范围的指令中绑定(bind)到 ng-model?

转载 作者:行者123 更新时间:2023-12-02 03:14:43 25 4
gpt4 key购买 nike

我想创建一个包装表单元素(输入、文本区域、选择等)并绑定(bind)到 ng-model 的指令。

用法如下:

<div ng-controller="formController">
<field
type="text"
ng-model="model.CellPhoneNumber"
label="Cell phone"
mini-help="Sample: 123412341234"
required="please give us your number"
numeric
cellPhone="cell phone number is invalid" />
<div>{{ model.CellPhoneNumber }}</div>
</div>
<script>
app.cp.register('formController', ['$scope', function ($scope) {

}]);
</script>

这是我的指令:

app.directive('field', function () {
return {
restrict: 'E',
replace: 'true',
scope: false,
require: 'ngModel',
template: '<div class="field">' +
'<label ng-if="label">{{ label }}</label>' +
'<input type="text" ng-if="type == \'text\'" required ng-model="ngModel" />' +
'<span class="mini help" ng-if="miniHelp">{{ miniHelp }}</span>' +
'<span class="messages">' +
'<span class="error message" ng-message="required" ng-if="requried">{{ required }}</span>' +
'</span>' +
'</div>',
link: function (scope, element, attributes, ngModel) {
scope.label = attributes.label;
scope.miniHelp = attributes.miniHelp;
scope.type = attributes.type;
scope.required = attributes.required;
}
};
});

但是,它不起作用。我坚持绑定(bind) ng-model。我知道我可以通过 scope: {} 切换到子范围,并且一切正常。但我需要 scope: false。

这是一个很好的例子,说明如何做到这一点。但是我找不到范围为 false 的样本。

Dynamic ng-model binding inside a directive

最佳答案

您非常接近您想要的解决方案。 link 函数的第四个参数是 ngModelController这不同于 ngModel .您的问题是您将其用作计划 ngModel。您需要做的只是一些小的更改。

首先,您需要将 ngModelController 绑定(bind)到您的 scope。然后,不是 ng-model="ngModel",而是绑定(bind) $viewValue,如下所示:ng-model="ngModel.$viewValue"。最后,您需要创建一个 watch ,以允许您的指令 field 更改 ngModel 的值,否则它将是单向的。

这是工作代码:

angular
.module('myApp', [])
.directive('field', function() {
return {
restrict: 'E',
replace: 'true',
scope: false,
require: 'ngModel',
template: '<div class="field">' +
'<label ng-if="label">{{ label }}</label>' +
'<input type="text" ng-if="type == \'text\'" required ng-model="ngModel.$viewValue" />' +
'<span class="mini help" ng-if="miniHelp">{{ miniHelp }}</span>' +
'<span class="messages">' +
'<span class="error message" ng-message="required" ng-if="requried">{{ required }}</span>' +
'</span>' +
'</div>',
link: function(scope, element, attributes, ngModel) {
scope.label = attributes.label;
scope.miniHelp = attributes.miniHelp;
scope.type = attributes.type;
scope.required = attributes.required;

scope.ngModel = ngModel;
scope.$watch(function() {
return ngModel.$viewValue;
}, function(newValue) {
ngModel.$setViewValue(newValue);
ngModel.$render();
});
}
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>

<div ng-app="myApp" ng-init="myModel = 'qwe'">
<field type="text" ng-model="myModel" label="Cell phone" mini-help="Sample: 123412341234" required="please give us your number" numeric cellPhone="cell phone number is invalid"></field>

<input type="text" ng-model="myModel">
<p>{{ myModel }}</p>
</div>

关于angularjs - 如何在没有范围的指令中绑定(bind)到 ng-model?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37708424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com