在AngularJS中观察外部变量?

时间:2014-02-25 01:41:06

标签: javascript angularjs

我在Chrome应用程序中编写了一个用于串行通信的小型JS库,它可以自行运行。但是,我们遇到了与Angular集成的问题:我没有办法从内部监视控制器外部的串行对象的属性,我无法找到解决方法。理想情况下,这个解决方案的计算成本并不太高,在这一点上,我并没有排除某种方式将整个库转换为更友好的Angular格式。但是,在这种情况下,我不确定它是应该采用服务还是其他格式。任何帮助将不胜感激。

3 个答案:

答案 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没有可靠地为我跑。有时重新评估观察值,有时则不重要。