gpt4 book ai didi

AngularJS - 创建使用 ng-model 的指令

转载 作者:行者123 更新时间:2023-12-02 22:15:16 24 4
gpt4 key购买 nike

我正在尝试创建一个指令,该指令将创建一个与创建该指令的元素具有相同 ng-model 的输入字段。

这是我到目前为止的想法:

HTML

<!doctype html>
<html ng-app="plunker" >
<head>
<meta charset="utf-8">
<title>AngularJS Plunker</title>
<link rel="stylesheet" href="style.css">
<script>document.write("<base href=\"" + document.location + "\" />");</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js"></script>
<script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
This scope value <input ng-model="name">
<my-directive ng-model="name"></my-directive>
</body>
</html>

JavaScript

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
$scope.name = "Felipe";
});

app.directive('myDirective', function($compile) {
return {
restrict: 'E',
scope: {
ngModel: '='
},
template: '<div class="some"><label for="{{id}}">{{label}}</label>' +
'<input id="{{id}}" ng-model="value"></div>',
replace: true,
require: 'ngModel',
link: function($scope, elem, attr, ctrl) {
$scope.label = attr.ngModel;
$scope.id = attr.ngModel;
console.debug(attr.ngModel);
console.debug($scope.$parent.$eval(attr.ngModel));
var textField = $('input', elem).
attr('ng-model', attr.ngModel).
val($scope.$parent.$eval(attr.ngModel));

$compile(textField)($scope.$parent);
}
};
});

但是,我不确定这是处理这种情况的正确方法,并且存在一个错误,即我的控件未使用 ng-model 目标字段的值进行初始化。

这是上面代码的一个 Plunker:http://plnkr.co/edit/IvrDbJ

处理这个问题的正确方法是什么?

编辑:从模板中删除 ng-model="value" 后,这似乎工作正常。但是,我将保留这个问题,因为我想仔细检查这是否是正确的方法。

最佳答案

编辑:这个答案很旧并且可能已经过时。只是提醒一下,以免人们误入歧途。我不再使用 Angular,因此我无法进行改进。

<小时/>

这实际上是一个很好的逻辑,但你可以稍微简化一下。

指令

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
$scope.model = { name: 'World' };
$scope.name = "Felipe";
});

app.directive('myDirective', function($compile) {
return {
restrict: 'AE', //attribute or element
scope: {
myDirectiveVar: '=',
//bindAttr: '='
},
template: '<div class="some">' +
'<input ng-model="myDirectiveVar"></div>',
replace: true,
//require: 'ngModel',
link: function($scope, elem, attr, ctrl) {
console.debug($scope);
//var textField = $('input', elem).attr('ng-model', 'myDirectiveVar');
// $compile(textField)($scope.$parent);
}
};
});

带指令的 HTML

<body ng-controller="MainCtrl">
This scope value <input ng-model="name">
<my-directive my-directive-var="name"></my-directive>
</body>

CSS

.some {
border: 1px solid #cacaca;
padding: 10px;
}

您可以通过此 Plunker 来查看它的运行情况.

这是我所看到的:

  • 我理解为什么你想使用“ng-model”,但在你的情况下这是没有必要的。 ng-model 是将现有 html 元素与范围内的值链接起来。由于您自己创建指令,因此您正在创建一个"new"html 元素,因此您不需要 ng-model。

编辑正如 Mark 在评论中提到的,没有理由不能使用 ng-model,只是为了遵守惯例。

  • 通过在指令中显式创建作用域(“隔离”作用域),指令的作用域无法访问父作用域上的“name”变量(我认为这就是您想要使用 ng-model 的原因)。
  • 我从您的指令中删除了 ngModel,并将其替换为您可以更改为任何名称的自定义名称。
  • 让这一切仍然有效的是作用域中的“=”符号。查看文档 docs在“范围”标题下。

一般来说,如果您希望指令中的值始终映射到父作用域中的值,则指令应使用隔离作用域(您做得正确)并使用“=”类型作用域。

关于AngularJS - 创建使用 ng-model 的指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14115701/

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