Angular partial - 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 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();
}
答案 0 :(得分:3)
使用timeout
将是一种解决方法,而是在控制器内部使用$scope
变量来了解ajax调用是否已完成。
在ajax完成之前,问题是ng-init
可能被调用。
我已经在我的角度项目中配置了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>
在控制器内部,
$http.get(gurl + '.json').success(function(data,status){
// some stuff
$scope.ajax_done = true;
}).error();
由于角度的神奇two-way binding,元素将会更新。现在它看到ajax请求已经完成,ui-if
将获得一个真正的值,并且该元素的ng-init指令将有机会执行其回调。
编辑:ui-if
已从Angular UI移除,转而使用现已内置的ng-if。
答案 1 :(得分:2)
以下是your fiddle的两项不同变化,似乎有效。
Fiddle 1 - 此版本使用文档here中所述的$scope.$apply(exp)
,在修改角度框架之外的角度绑定数据时非常有用。在这个例子中,setTimeout
是罪魁祸首。
setTimeout(function(){
console.log("updateVal" );
$scope.$apply(function() {
$scope.updateVal2();
});
console.log($scope.tagsSelection);
},5000);
Fiddle 2 - 此版本使用名为$timeout服务的setTimeout
的angular's包装。
$timeout(function(){
console.log("updateVal" );
$scope.updateVal2();
console.log($scope.tagsSelection);
},5000);