AngularJS创建一个指令,然后使用另一个指令
AngularJS creating a directive then uses another directive
我正在尝试创建一个指令,以减少我必须编写的样板代码。
我使用angular的xeditable指令来允许内联编辑,但是当我从我的指令中添加xeditable指令属性时,它不起作用。
当我说它不起作用时,我的意思是通常当我点击元素时,会出现一个输入框,而现在当我点击元素时什么也没发生。
Glenn.directive('edit', function() {
return {
restrict: 'A',
template: '{{ content.' + 'ParamData' + '.data }}',
scope: {
ParamData: '@edit'
},
link: function(scope, element, attrs) {
element.attr('editable-text', 'content.' + attrs.edit + '.data');
element.attr('onbeforesave', 'update($data, content.' + attrs.edit +'.id');
}
}
});
所以,我的第一个问题是,xeditable指令不工作,因为它在我的内部。我是创建angularjs指令的新手,但我想知道它是否可以与其编译的方式有关?
我的第二个问题是模板。如果我的模板是这样的
template: '{{ ParamData }}'
然后它输出正确的数据,但是如果没有其他部分引用范围数据,我就无法使它工作。
还有,下面是使用
指令时视图的样子<h2 edit="portrait_description_title"></h2>
如果我没有使用指令来减少锅炉代码
<h1 editable-text="content.portrait_description_title.data" onbeforesave="update($data, content.portrait_description_title.id)">
{{ content.portrait_description_title.data }}
</h1>
谢谢你的建议!
您必须在添加这些属性后重新编译元素,下面是一个示例:
示例柱塞: http://plnkr.co/edit/00Lb4A9rVSZuZjkNyn2o?p=preview
.directive('edit', function($compile) {
return {
restrict: 'A',
priority: 1000,
terminal: true, // only compile this directive at first, will compile others later in link function
template: function (tElement, tAttrs) {
return '{{ content.' + tAttrs.edit + '.data }}';
},
link: function(scope, element, attrs) {
attrs.$set('editable-text', 'content.' + attrs.edit + '.data');
attrs.$set('onbeforesave', 'update($data, content.' + attrs.edit + '.id)');
attrs.$set('edit', null); // remove self to avoid recursion.
$compile(element)(scope);
}
}
});
注意事项:
- 删除孤立的作用域以简化事情,因为似乎您想首先直接绑定到控制器
content.portrait_description_title.data
中的作用域。 -
template:
也接受函数,这样可以得到edit
属性值来构造模板。 - 标记为
terminal
指令并引发priority
,这样在第一次运行时,只有这个指令(在同一元素中的其他指令之外)将被编译。 -
attrs.$set()
用于添加/删除属性,使用它添加editable-text
指令和onbeforesave
。 - 删除指令本身,即
edit
属性,以防止下一次编译后的递归。 - 使用
$compile
服务重新编译元素,以使editable-text
和onbeforesave
工作
只需在第一个指令的模板中添加另一个指令,并将其绑定到您从attr中获得的作用域模型。您还可以添加控制器功能,并创建更多的模型,或逻辑和绑定到指令模板。
也可能你的属性在模板上不可用,那么你需要在你的隔离作用域模型中添加$watch,并在控制器中更新另一个作用域模型。第二个模型需要绑定到模板。关于指令的更多信息你可以在AngularJS文档中找到,这里有一篇很好的文章,它可以帮助你:
http://www.sitepoint.com/practical-guide-angularjs-directives-part-two/相关文章:
- 在指令控制器中使用$attrs时出现问题
- 参数变量出现ngTable指令问题
- 让文本输入幻灯片显示输入时的新文本输入?然后向后滑动
- Javascript运行php文件,然后下载文件
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 如何将屏幕分辨率乘以 80%,然后在代码中使用
- 使用每次都不同的transclude重复指令
- 弹出窗口出现,然后退出
- 打开一个模态并将其链接到AngularJS中的指令
- 如何在JQuery函数中定义一个值,然后调用另一个函数并使用该值
- 从html创建一个指令,该指令按类名应用函数
- 将值输入到对象,然后该对象推送到数组
- 将JSON对象传递给angular指令
- AngularJS - 将多个 get 请求收集到 json 数组中,然后传递给指令
- AngularJs:将一个值传递给打开ngDialog的指令,然后将更新的值反映回根作用域
- 如何在一个节点包中创建一个AngularJs指令,然后将它包含在应用的另一个节点包中
- Ng-repeat使用键和值,然后使用键作为ng-model的指令值
- AngularJS创建一个指令,然后使用另一个指令
- 将元素从链接函数传递给指令中的控制器函数,然后再传递给另一个指令
- 如何更改指令中的数组,然后在控制器中反映该更改