Javascript 使用angularjs中的指令进行模板化
我试图找出在angularjs中在何处以及如何使用指令。我有几个页面有很多输入字段,每次我想添加一些条件ng类和一个只在特定条件下显示的按钮。可以在以下位置看到一个粗略的示例: 现在我想少打字,希望指令能帮助我。下面的代码不起作用,但它可能显示了我要去的地方: 以下是我希望键入html的方式:Javascript 使用angularjs中的指令进行模板化,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我试图找出在angularjs中在何处以及如何使用指令。我有几个页面有很多输入字段,每次我想添加一些条件ng类和一个只在特定条件下显示的按钮。可以在以下位置看到一个粗略的示例: 现在我想少打字,希望指令能帮助我。下面的代码不起作用,但它可能显示了我要去的地方: 以下是我希望键入html的方式: <tr> <td>First Name:</td> <td> <dirty-input attr="firstN
<tr>
<td>First Name:</td>
<td>
<dirty-input attr="firstName"/>
</td>
</tr>
<tr>
<td>Last Name:</td>
<td>
<dirty-input attr="lastName"/>
</td>
</tr>
本指令:
app.directive('dirtyInput', function() {
return {
restrict: 'E',
scope: {
attr: '=attr',
},
template: '<input type="text" ng-model="{{attr.editedObject}}.{{attr.attrName}}"/>'
};
});
myApp.directive('myDirtyInput', function () {
return {
restrict: 'E',
replace: true,
templateUrl: 'DirtyInput.html',
controller: '@',
name: 'ctrl'
};
});
app.directive('dirtyInput',function(){
返回{
限制:'E',
范围:{
属性:'=attr',
},
模板:“”
};
});
这可以在以下网址看到:
显然,这是行不通的。我是在尝试做一些不可能的事情,还是我只是做错了?你很接近 有几件事需要改变:
ngModel
上,您必须引用范围中的属性。而不是:
ng model=“{{attr.editedObject}.{{attr.attrName}}
您应该有如下内容:
ng model=“attr.editedObject[attr.attrName]
(这意味着:“绑定到由作用域的
attr
属性引用的对象的'editedObject'属性引用的对象的名为x的属性。其中x是名称等于attr
的'attrName'属性值的属性。”)是的,随便
PersonEded
),它需要一个对它的引用。有几种方法可以实现这一点,但我认为最简单的方法是在firstname
,lastname
对象中放置对它的引用。例如:而不是:
$scope.firstName={…editedObject:'PersoneEded',…}
用法:
$scope.firstName={…编辑对象:$scope.personEdited,…}
另请参见此您误解了隔离作用域的工作原理。指令的模板正在尝试访问其隔离作用域上的
{{attr.editedObject}.{{attr.attrName}
。让我们假设angular将{{attr.editedObject}.{{attr.attrName}}
解析为personEdited.firstName
。现在考虑隔离范围,它当前由单个属性组成,PersonEditiond.firstName
时,它会在其隔离范围内查找,并且只会看到attr
。因为personedid
未定义,所以不会发生任何事情。为了使其工作,您必须在隔离范围中包含另一个属性,该属性在您的控制器范围中分配了PersonEdition的值。该属性需要命名为PersonEditiond
:
scope: {
attr: '=attr',
personEdited: '=personEdited'
}
然后您需要在指令用法中指定它:
现在,您的隔离作用域将可以访问您的PersonControl
中定义的PersonEditiond
对象。希望这有帮助
编辑
考虑一下这个问题后,您可能想尝试指令中的控制器。根据我对您的问题的猜测,您真正想要的是访问
PersonController
的范围。您可以使用指令中的以下语法完成此操作:
app.directive('dirtyInput', function() {
return {
restrict: 'E',
scope: {
attr: '=attr',
},
template: '<input type="text" ng-model="{{attr.editedObject}}.{{attr.attrName}}"/>'
};
});
myApp.directive('myDirtyInput', function () {
return {
restrict: 'E',
replace: true,
templateUrl: 'DirtyInput.html',
controller: '@',
name: 'ctrl'
};
});
这里需要注意的两件事是控制器属性和名称属性。它们告诉angular js的是,我们将允许指令的用户绑定一个控制器供我们使用,它将通过在指令声明中定义ctrl
属性来分配。因此,在我们的例子中,这将看起来像:
<my-dirty-input ctrl="PersonController"></my-dirty-input>
现在,当控制器绑定到指令时,我们可以从指令中完全访问控制器范围。我们不必创建隔离作用域,只需开始访问控制器的属性即可
下面是一个plunker的例子,我猜你的目标是什么(根据你发布的小提琴):我喜欢这种方法,但我无法让它发挥作用。你能看看这个JSFIDLE的错误吗:对不起,这不是我真正想要的。如我的JSFIDLE示例所示,我希望在一个控制器的范围内有多个输入字段。我的计划是这样指定一个字段名:而不是为每个字段名创建一个控制器。