我在Chrome应用程序中编写了一个用于串行通信的小型JS库,它可以自行运行。但是,我们遇到了与Angular集成的问题:我没有办法从内部监视控制器外部的串行对象的属性,我无法找到解决方法。理想情况下,这个解决方案的计算成本并不太高,在这一点上,我并没有排除某种方式将整个库转换为更友好的Angular格式。但是,在这种情况下,我不确定它是应该采用服务还是其他格式。任何帮助将不胜感激。
答案 0 :(得分:6)
从这里借用了这个想法:In AngularJS, how do I add a $watch on the URL hash?
$ scope。$ watch接受函数作为第一个参数,所以你可以这样做:
$scope.$watch(function () {
return mylib.myproperty
}, function (value) {
// do stuff
});
更新: 正如评论中所指出的,当mylib.myproperty改变时,控制器将不知道它直到下一个摘要cicle。由于mylib不支持角度,因此您需要使用普通的javascript回调机制:
mylib.on_myproperty_change(function(){
$scope.$digest(); // this will cause the $watch to be re-evaluated
});
但是既然现在你已经有了mylib.on_myproperty_change
,你真的不需要$watch
任何东西,所以你可以删除手表而只是
mylib.on_myproperty_change(function(){
//do the stuff that you did in the the $watch
$scope.$digest();
});
答案 1 :(得分:1)
创建自己的自定义库作为Angular服务:
myAngularApp.service('MyCustomLib', function(){
return myCustomLibInstance;
}]
);
然后您可以将其传递给控制器并将其保存到本地范围:
function MyCtrl($scope,MyCustomLib) {
var myCustomLib = MyCustomLib;
现在你可以从控制器内部访问你的自定义库了,你可以设置一个手表,正如@tony在他的回答中建议的那样:
$scope.$watch(
function () {
return myCustomLib.property
},
function (newValue, oldValue) {
// do stuff
});
答案 2 :(得分:0)
我用来启动摘要周期的方法是$timeout(function () {})
。
$scope.$digest()
将抛出错误。
我有
// From my controller
externalService.setOnChangeCallback(function () { $timeout(function () {}) });
// in my service
// on change event
this.onChangeCallBack();
$scope.$watch
没有可靠地为我跑。有时重新评估观察值,有时则不重要。