我有一个模型:
class MyViewModel : ViewModel(){
private val _user = MutableLiveData("")
val user: LiveData<String> = _user
fun onBtnClick(){
Log.i("MyViewModel", "user: ${_user.value}")
}
}
我用片段布局连接它:
<data>
<variable
name="viewmodel"
type="com.pkg.pkg.pkg.fragments.concretePkg.MyViewModel" />
</data>
<EditText
...
android:text="@={viewmodel.user}"
android:hint="User" />
在onCreateView方法的片段类中:
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_my_fragment, container, false)
binding.lifecycleOwner = this
// bind viewModel
viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
binding.viewmodel = viewModel
// Inflate the layout for this fragment
return binding.root
我可以从fragment或ViewModel类中更改EditText
值,但是当我试图在Logcat中的ViewModel的onBtnClick
方法中获取值时,我得到的消息是:I/MyViewModel:user:
我缺少了什么,这样双向数据绑定也可以从另一个方向工作?简而言之,数据在界面上从ViewModel/Fragment流向EditText,但不会从界面上的EditText流向ViewModel字段/方法。提前谢谢。
-------编辑------我设法填充了所有内容,但我知道我遇到了以下错误:
Details: There is no inverse for method getValue, you must add an @InverseMethod annotation to the method to indicate which method should be used when using it in two-way binding expressions
我想这是因为viewmodel。用户是LiveData类型,而不是字符串类型。我写过绑定适配器:
@BindingAdapter("android:text")
fun setLiveDataText(editText: EditText, liveData: LiveData<String>) {
if(liveData == null){
editText.setText("")
} else {
editText.setText(liveData.value)
}
}
但我仍然得到了上述信息。
这个问题的答案是为了工作,你应该把这个添加到构建中。格雷德尔:
implementation "android.arch.lifecycle:extensions:1.1.1"
kotlin版本应该降级:
ext.kotlin_version = '1.3.41'
干杯
首先,你需要将用户公开。然后你需要使用“@={viewmodel.\u user}”
,这样你就可以得到\u user
的值。如果不公开数据绑定变量,数据绑定API就无法找出并生成代码。对于字符串这样的简单字段,这种方法就足够了,但对于更复杂的情况,您可能必须实现BindingAdapters
。有关示例,请参阅本文。
1. 前言 本小节我们将介绍 Vue 中数据的双向绑定指令 v-model。v-model 的学习相对简单 我们可以用 v-model 指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。 2. 慕课解释 用 v-model 指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选
出于好奇和增加知识,我想在dom元素和javascript变量之间实现某种双向数据绑定。 我很幸运,在这里@stackoverflow找到了一个很好的答案,解决了我一半的问题,这就引出了这个要点https://gist.github.com/384583,但我仍然无法100%完成这件事。 下面是我的代码示例:http://jsfiddle.net/bpH6Z/ 如果您尝试运行fiddle并单击“查
问题内容: 我对这些概念有些模糊,如果我完全在AngularJS和ReactJS中构建相同的ToDo应用程序,那么,什么使React ToDo使用单向数据绑定而不是AngularJS的双向数据绑定? 我了解React之类的作品 渲染(数据)—> UI。 这与Angular有何不同? 问题答案: 角度的 当角度设置数据绑定时,存在两个“观察者”(这是一种简化) 输入将以开始,然后更新为1000ms。
Mpx针对表单组件提供了wx:model双向绑定指令,类似于v-model,该指令是一个语法糖指令,监听了组件抛出的输入事件并对绑定的数据进行更新,默认情况下会监听表单组件的input事件,并将event.detail.value中的数据更新到组件的value属性上。 简单实用示例如下: <view> <input type="text" wx:model="{{message}}"> <
双向绑定这个概念在angular出现的时候,就作为王牌概念. 现在几乎是个js前端框架,就有这个功能. 它的概念是: 某个变量, 如果展现在页面上的话: 如果在代码层面进行修改, 那么页面的值就会发生变化 如果在页面进行修改(例如在input标签中), 那么代码的值就会发生变化. 一个演示例子. 在我们的项目中,增加一个 vue页面: src/components/TwoWayBinding.vu
单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新。 有单向绑定,就有双向绑定。如果用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定。 什么情况下用户可以更新View呢?填写表单就是一个最直接的例子。当用户填写表单时,View的状态就被更新了,如果此时MVVM框架可以自动更新Model的状态,那就相当于我