如何对动态值的子指令进行排序
How to sort child directives on dynamic values
我发现这是一个有用的模式:
编写为角度指令的小工具:
MyApp.directive('parentWidget', function () {
return {
controller: function ($scope) {
$scope.widgets = [{n: 1}, {n: 2}, {n: 3}];
}
};
});
MyApp.directive('childWidget', function () {
return {
scope: {myAttr: '@myAttr'},
controller: function ($scope) {
$scope.dynamicValue = function () {
return 'dynamic';
};
}
};
});
父窗口小部件包含在页面中,如下所示:
<table parent-widget></table>
父窗口小部件的模板如下所示:
<thead>
<tr>
<th>The Dynamic Column</th>
<th>The Static Column</th>
</tr>
</thead>
<tbody>
<tr child-widget
ng-repeat="w in widgets | orderBy:n"
my-attr="{{w.n}}">
</tr>
</tbody>
子窗口小部件的模板如下所示:
<td>{{ dynamicValue() }}</td>
<td>{{ myAttr }}</td>
我的问题:如何根据子窗口小部件的动态值排序表格?如图所示,我对静态值很满意。
我唯一能想到的就是使用jquery来处理事实之后的<tr>
,这是非常不成角度的。
编辑:一些乐于助人的评论者证实了我的怀疑,即这是不可能的。所以我想我的问题是,重组这种模式以允许这样的排序的最佳方法是什么?我更愿意继续分离关注点,即dynamicValue()是子窗口小部件的关注点,代码应该反映这一点。
解决:公认的答案有几个有用的线索。特别是,在子指令的作用域中使用双向绑定,以及在DOM上对模型进行排序的建议。我必须添加一个$watch
才能实现,请参见下文。我很想听听任何人的意见,如果他们能在这方面有所改进的话。
工作jsfiddle
问题的角度方法:
如果要以角度方式进行排序,请将排序应用于模型,而不是应用于已呈现到页面中的<tr>
元素。唯一知道模型的完整相关部分的地方是父小部件的控制器,这就是必须进行排序的地方。
后果:
为了能够排序,您当然需要访问指令生成的动态值,但这不是问题,因为您的指令可以在它们看到的模型片段中设置动态值。然而,他们必须能够将值写入他们的小部件对象(模型):
MyApp.directive('parentWidget', function () {
return {
controller: function ($scope) {
// init the dynamic values with null to make explicit that they
// are part of the model
$scope.widgets = [{n: 1, d: null}, {n: 2, d: null}, {n: 3, d: null}];
}
};
});
MyApp.directive('childWidget', function () {
return {
scope: {
myAttr: '@',
dynamicValue: '='
},
controller: function ($scope) {
// assign the function here or a static value. Whatever works best for you.
$scope.dynamicValue = function () {
return 'dynamic';
};
}
};
});
当然,然后在模板中参数化你的指令:
<tr child-widget
ng-repeat="w in widgets | orderBy:n"
my-attr="{{w.n}}"
dynamic-value="w.d">
</tr>
就我而言,我更喜欢将实际的动态值写入模型,而不是计算它的函数,但正如注释中所示,如果您进行相应的排序,两者都会起作用。
如果您想修改子级,使其能够按它们排序,则将它们作为对象而非属性传递。
<tr ... my-attr="w"></tr>
和
<td>{{ myAttr.dynamicValue }}</td><td>{{ myAttr.n }}</td>
jsfiddle:http://jsfiddle.net/4J2aw/
- 在指令控制器中使用$attrs时出现问题
- 参数变量出现ngTable指令问题
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 使用promise和mongoose对文档进行排序
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Selectize.js:如何对整数值的选项进行排序
- Javascript排序的图像弹出窗口..可以't单独弹出
- 使用每次都不同的transclude重复指令
- 打开一个模态并将其链接到AngularJS中的指令
- 如何通过引用var Using DataTables来进行分页或排序
- 如何使用带有隐含的角度指令对表进行排序
- 在angularjs ng-repeat指令中对对象进行排序
- 如何对动态值的子指令进行排序
- 迁移到AngularJS 1.2会破坏可排序包装器指令
- 从控制器中的 ng-sortable 指令获取可排序实例
- sortBy不对指令表中的项进行排序
- 创建指令,该指令将每个列表元素包装在引导面板中,并带有删除、重新排序…的控件…
- 需要帮助实现jquery指令的排序
- 排序指令的Angular架构
- 如何对已呈现的集合进行排序?比如angularjs的orderBy指令