Javascript AngularJS-$watch内的初始化,这取决于两个模型

Javascript AngularJS-$watch内的初始化,这取决于两个模型,javascript,angularjs,Javascript,Angularjs,我有一个异步JS函数(即一个http请求,但是一个请求,这是通过Java绑定对我的JavaFX应用程序的直接调用),它返回一些结果并将其放入模型属性中,modelAttribute1 我还有一个$watch函数用于其他一些型号modelAttribute2,它使用了第一个型号,即: scope.$watch(modelAttribute2, function(newVal, oldVal){ scope.$apply(function(){ // newVal is co

我有一个异步JS函数(即一个http请求,但是一个请求,这是通过Java绑定对我的JavaFX应用程序的直接调用),它返回一些结果并将其放入模型属性中,
modelAttribute1

我还有一个
$watch
函数用于其他一些型号
modelAttribute2
,它使用了第一个型号,即:

scope.$watch(modelAttribute2, function(newVal, oldVal){
    scope.$apply(function(){
        // newVal is correct, but modelAttribute1 is not yet initialized!
        scope.scriptText = loadFile(newVal, scope[modelAttribute1]); 
    });
});
问题是这个watch表达式是在我从Java获得结果之前执行的


那么,有没有一种方法可以做到这一点,比如创建一个承诺并倾听它的计算完成

有承诺的解决方案:

var d1 = $q.defer(), d2 = $q.defer();

scope.$watch("modelAttribute1", function(newVal) {
    if( newVal != null ) d1.resolve(newVal);
});
scope.$watch("modelAttribute2", function(newVal) {
    if( newVal != null ) d2.resolve(newVal);
});

$q.all([d1, d2]).then(function(arr) {
    // here scope.modelAttribute1 = arr[0],
    //      scope.modelAttribute2 = arr[1]
    scope.scriptText = loadFile(arr[1], arr[0]);
});

由于http请求是异步的,我们可以用如下承诺来包装它:

   var data = //...<from http>
   var deferred = $q.defer();
   deferred.resolve(data);
   deferred.then(function(arr) {   
      modelAttribute1 = arr;
    });

在成功函数中写下承诺可以解决问题??我想??如果我不尝试,我不能说,但我不能这样做,因为在我的例子中,我还没有实现对回调函数的支持:-)当您在未定义oldVal和newVal的情况下设置手表时,第一次调用$watch。你应该建立一个类似于
if(newVal){…}
的检查。我可能错了,但是我正在用
nginit
初始化,这就是为什么第一次调用定义了
newVal
。谢谢你的指点。谢谢,我来看看。
scope.$watch(modelAttribute2, function(newVal, oldVal){
    scope.$apply(function(){
        // newVal is correct, but modelAttribute1 is not yet initialized!
        scope.scriptText = loadFile(newVal, scope[modelAttribute1]); 
    });
}, true);