Javascript AngularJS-$watch内的初始化,这取决于两个模型
我有一个异步JS函数(即一个http请求,但是一个请求,这是通过Java绑定对我的JavaFX应用程序的直接调用),它返回一些结果并将其放入模型属性中,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
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);