2014-07-07 19 views
2

我遇到的问题的值为ng-model,应用于使用AngularStrap的bs-typeahead的元素,无法在范围内访问。但是在HTML中可以使用{{ var }}AngularStrap的`ng-model` bs-typeahead`在作用域中不可用?

我有以下HTML:

<input type="text" placeholder="add a destination" ng-options="item as item for item in modelTypeahead" ng-model="selectedDestination" bs-typeahead data-template="templates/SrcDstTypeaheadTemplate.html"> 

我初始化变量在我的控制器:

$scope.selectedDestination = ""; 

放置一个{{ selectedDestination }}其他地方中的HTML工作正常。

但是,当我在我的控制器中执行console.log($scope.selectedDestination);时,它会以空字符串的形式出现。

如果更新我的初始化要的东西,例如:

$scope.selectedDestination = "abc123"; 

...无论是<input>{{ selectedDestination }}更新适当。我的console.log也会吐出设定值。但是,如果我更新键入{{ selectDestination }}将更新,但我的console.log仍然会吐出'abc123'。

是否有我缺少的范围问题?我不明白{{ selectedDestination }}是如何输出正确的字符串,但console.log正在推出一些不同的东西。这几乎看起来我的绑定是单向的,但AngularStrap的bs-typeahead应该是双向的(根据所有示例)。

+0

遇到完全相同的问题。你解决了吗? –

+0

不。看起来,从前面的选择不会完全传播。我还没有发现究竟如何/为什么。 –

回答

0

你在做什么console.log?你必须确保该值已更改此之前,对于价值展现出来,你可以这样做:

$scope.watch('selectedDestination', function() { 
    console.log($scope.selectedDestination); 
}); 
+0

我已经完成了。最近,我通过按钮按下(仅用于测试目的)。我在上面添加了'$ watch'代码,并且在我键入或确认提前选择时从不会触发。 –

0

我不知道,如果你仍然遇到任何问题,这一点,但是当我刚刚遇到它时,我发现了一个解决完全相同问题的解决方案。我几乎肯定它的范围问题或在AngularStrap内部应用失败,但我不知道从哪里开始寻找。

真的,我没有足够的教育,给你确切的原因,这个工作,但是这是你做了什么:

(1)你改变变量的对象。

当您放置模型并观察对象而不是顶层变量时,它可以通过指令层更好地工作。不要问我为什么......

(2)对您刚刚创建的对象进行深入观察。

当您将其更改为对象时,您需要在变量上使用deep watch,否则$ apply和$ digest将不会接受任何更改。这是因为默认情况下,该值将被检查为“参考”相等而不是“值”相等。这会中断,因为对象的“参考”不会改变,只有它的值。但要小心使用这种深入的比较,因为额外的努力会导致大量的开销。

下面是使用的实例与AngularStrap的预输入:

$scope.selectedDestination = {}; 

~~~ 

<input type="text" placeholder="add a destination" ng-options="item as item for item in modelTypeahead" ng-model="selectedDestination.destination" bs-typeahead data-template="templates/SrcDstTypeaheadTemplate.html"> 

~~~ 

$scope.$watch('selectedDestination', function(value) { 
    console.log('selectedDestination', $scope.subComponent); 
}, true); //here we need to tell the watch to do a deep watch 

编辑回几件事情我跟踪我的问题,但它的一部分是$渲染功能。我会继续研究它。祝你好运!