模型直接$watched和调用的视图与角度-一个好主意
Models directly $watched and invoked by the View with Angular - a good idea?
我遇到了一个问题(我想我能理解),但我不清楚解决方案是什么。
简而言之,我有一个BackendService
,它封装了一些非Angular对象模型(在我的例子中是SharePoint,但这与重点无关)。我创建了这个BackendService
,这样它就可以返回Angular兼容的实体(items
),这样我就可以做如下操作:
angular.module("app", [])
.factory("BackendService", function(){
return new BackendService();
})
.controller("MainCtrl", function($scope, BackendService){
BackendService.GetItems()
.then(function(items){
$scope.Items = items;
$scope.$apply();
});
});
到目前为止还不错。
除了,我希望每个item
都是一个自给自足的ViewModel-y,这样它就可以直接在视图中使用。换句话说,我想做以下操作(注意按钮的ng-show
和ng-click
):
<div ng-controller="MainCtrl">
<div ng-repeat="item in Items">
<input ng-model="item.fieldA" type="text"/>
<input ng-model="item.fieldB" type="text"/>
<button ng-show="item.IsDirty()" ng-click="item.Save()">Save</button>
</div>
</div>
当有任何更改(设置脏标志)时,按钮会立即显示,但当item.Save()
(async函数)在脏标志未设置的地方被调用时,更改在DOM中不可见。
所以问题是:item.IsDirty() === false
时按钮不会隐藏。
我的理解是,item.Save()
是一个异步函数,它使用的对象模型在背后使用Ajax(它不使用$http,因为它不知道Angular),因此绕过了摘要循环。因此,item.IsDirty()
中的更改永远不会反映在DOM中。
问题:
- 我对这个问题的理解正确吗
- 这种方法是否冒犯了Angular的最佳实践
- 我现在必须做点什么吗比如
<button ng-click="SaveItem(item)">
,并在其中调用$scope.$apply
编辑(针对Gordon的回答):
- 在服务,或者服务应该是角度不可知的?如果没有,什么更可取
谢谢!
问题是您的scope.items数组没有绑定到服务中的任何数据。我会通过在您的服务中的对象上设置一个items属性来解决这个问题,该属性是绑定到您的scope items属性的数据。
BackendService.loadData()
.then(function() {
$scope.data = BackendService.data;
});
// data is an object with a property items
然后,就在服务中的数据发生更改时,更新本地项数组,它们将被角度数据绑定跟踪。
啊,我终于明白了。我可以用发射来触发应用程序来绕过它:http://plnkr.co/edit/F8rLK2?p=preview
请参阅此问答;鹿的A:angularjs ng显示与承诺表达式
- 将脚本缓存到本地存储的basket.js概念仍然是一个好主意吗
- 使用每500ms运行一次的jquery函数是个好主意吗
- 在debounce函数中使用requestAnimationFrame是个好主意吗
- 通过进程使用 NodeJS 全局事件是个好主意吗?
- 将我所有的.js分组到一个文件中-好主意
- 与AMD共享库是个好主意吗
- 在Coffeescription中使用一个自调用函数来隐藏其余代码中的函数和变量,这是一个好主意吗
- 开发两个单独的节点应用程序来提供 Web 服务和使用 Web 服务以在浏览器上呈现它是一个好主意吗?
- Javascript中的异步类是一个好主意吗?
- 在 JavaScript 中将小数字合并为一个是个好主意吗?(作为存储优化解决方案)
- 我可以定义一个函数来处理在 2 个输入标签上定义的“更改键控”事件吗?这是个好主意吗
- 使用经典继承,在 JavaScript 中使用“类级”/成员变量是一个好主意还是坏主意
- 模型直接$watched和调用的视图与角度-一个好主意
- API开发,Bootstrap和jQuery.将它们全部注入到用户代码中是一个好主意
- 将GWT与HTML5 Canvas一起使用是一个好主意吗?
- 在通过JavaScript连接的链接上省略HREF是一个好做法(或好主意)吗?
- 使用JQuery是一个好主意吗?当这件事可以用简单的JavaScript轻松完成时
- 调用一个为ng-show返回布尔值的函数是个好主意吗
- 为什么重写本机方法不是一个好主意?
- 这是一个好主意,实现注入之前和之后的建议在javascript