Angularjs 角度-ng init内部不可用的数据
角度部分-HTML。 BaseCtrlAngularjs 角度-ng init内部不可用的数据,angularjs,angularjs-scope,Angularjs,Angularjs Scope,角度部分-HTML。 BaseCtrl <div ng-controller="SelectTagCtrl"> <input type="text" ng-init="setTags(viewData['users'])" ui-select2="tagAllOptions" ng-model="tagsSelection" name="users" /> {{viewData['users']}} ECHOES CORRECT
<div ng-controller="SelectTagCtrl">
<input type="text" ng-init="setTags(viewData['users'])" ui-select2="tagAllOptions" ng-model="tagsSelection" name="users" />
{{viewData['users']}} ECHOES CORRECTLY.
But undefined when passed inside ng-init callback.
</div>
<input type="text" class="span12" placeholder="Brief Description" name="description" value="{{viewData['description']}}">
ECHOES CORRECTLY.
Controller.js
function SelectTagCtrl(){
$scope.setTags = function(data){
// data is undfined when viewData['users'] is used. <-- PROBLEM
// correct when I pass some static string.
}
}
//POPULATING viewData to be used inside view partial.
function BaseCtrl(){
$http.get(url).success(function(data){
$scope.viewData = data.data || [];
$scope.view_type = $scope.viewData['view_type'];
$scope.fields = data.data.fields;
console.log($scope);
}).error();
}
这里有两个不同的变化,似乎工作 -此版本使用文档中描述的$scope.$applyexp,在角度框架之外修改角度绑定数据时非常有用。在本例中,setTimeout是罪魁祸首
setTimeout(function(){
console.log("updateVal" );
$scope.$apply(function() {
$scope.updateVal2();
});
console.log($scope.tagsSelection);
},5000);
-此版本使用angular的setTimeout包装,称为服务
这里有两个不同的变化,似乎工作 -此版本使用文档中描述的$scope.$applyexp,在角度框架之外修改角度绑定数据时非常有用。在本例中,setTimeout是罪魁祸首
setTimeout(function(){
console.log("updateVal" );
$scope.$apply(function() {
$scope.updateVal2();
});
console.log($scope.tagsSelection);
},5000);
-此版本使用angular的setTimeout包装,称为服务
使用timeout将是一种变通方法,相反,我将在控制器中使用$scope变量来了解ajax调用是否已完成
问题是在ajax完成之前可能会调用ng init
我已经在angular项目中配置了ui if指令,所以我将其与$scope变量组合使用,以使其正常工作
<div ng-controller="SelectTagCtrl" ui-if="ajax_done">
<input type="text" ng-init="setTags(viewData['users'])" ui-select2="tagAllOptions" ng-model="tagsSelection" name="users" />
</div>
由于angular的魔力,元素将得到更新。现在它看到ajax请求已完成,ui if将获得一个truthy值,元素的ng init指令将有机会执行其回调
EDIT:ui-if已从中删除,现在内置了它。使用timeout将是一种解决方法,相反,我将在控制器中使用$scope变量来了解ajax调用是否已完成
问题是在ajax完成之前可能会调用ng init
我已经在angular项目中配置了ui if指令,所以我将其与$scope变量组合使用,以使其正常工作
<div ng-controller="SelectTagCtrl" ui-if="ajax_done">
<input type="text" ng-init="setTags(viewData['users'])" ui-select2="tagAllOptions" ng-model="tagsSelection" name="users" />
</div>
由于angular的魔力,元素将得到更新。现在它看到ajax请求已完成,ui if将获得一个truthy值,元素的ng init指令将有机会执行其回调
编辑:ui if已从中删除,但现在已内置。这很可能是因为在编译ng init指令时,$http.get尚未完成。这取决于您在setTags中到底要做什么?我要说的是,把setTags中的逻辑移到success回调中,不要使用nginit,我试过了。这似乎很明显。但这会影响到其他事情。你想实现什么目标?我不认为这是ng init的预期用途,而是在应用程序启动之前初始化值。我不确定它是否可以用于异步调用。这可能是有可能的,也许有一些精心的使用。它会工作的想法不正确。如果我把setTags的逻辑放在success回调中。但问题是,如果我更新ng模型值,旧值就会丢失。我将用我的场景更新这个问题,这很可能是因为$http.get在编译ng init指令时尚未完成。这取决于您在setTags中到底要做什么?我要说的是,把setTags中的逻辑移到success回调中,不要使用nginit,我试过了。这似乎很明显。但这会影响到其他事情。你想实现什么目标?我不认为这是ng init的预期用途,而是在应用程序启动之前初始化值。我不确定它是否可以用于异步调用。这可能是有可能的,也许有一些精心的使用。它会工作的想法不正确。如果我把setTags的逻辑放在success回调中。但问题是,如果我更新ng模型值,旧值就会丢失。我会用我的情景更新这个问题。我发现你的答案很有用+1,但setTimeOut不是解决此问题的正确方法。我将发布我如何解决我的具体问题是的,我确实觉得我不一定回答问题本身,但很高兴它有帮助!我觉得你的答案很有用+1,但setTimeOut不是解决此问题的正确方法。我将发布我如何解决我的具体问题是的,我确实觉得我不一定回答问题本身,但很高兴它有帮助!